Quando si divide un server Node.JS tra il modello e i controllori, chi deve trasformare i dati per il database per capire?

0

Ho un server node.js per un'API divisa tra controllori e modelli (esiste un router che è autopopolato su runtime). Ad esempio, ecco un classico endpoint per il recupero dei dati di configurazione:

controller

import config from '../models/config';

let routes = {
  '/v1/config/:key':  {
    get: async function (next) {
      let value = await config.get(this.params.key);
      this.body = {
        key: this.params.key,
        value: value
      };
      return;
    }
  }
}

model

import datastore from 'nedb-promise';
import conf from '../../../config';
import mkdirp from 'mkdirp';


mkdirp(conf.baseDir + '/data/')
const db = new datastore(config.baseDir + '/data/config.db');

const config = {
  get: async (key) => {
    const res = await db.find({key: key});
    return {
      key: res[0].key,
      value: res[0].value
    };
  },
  getValue: async (key, defVal) => {
    return config.get(key).value || defVal;
  },
  insert: async (key, value) => {
    doc = {
      key: key,
      value: value
    };
    return db.insert(doc);
  }
}

Quindi, ad esempio, il modello trasforma i dati dei database in dati trasmissibili. Quello che fa qui è molto semplice, crea semplicemente un nuovo oggetto con le chiavi previste, quindi rimuovendo la chiave _id . La funzione getKey è una scorciatoia intesa internamente a recuperare le chiavi di configurazione nel back-end. (tieni presente che questo codice potrebbe contenere qualche errore che non ho ancora testato).

Ma la trasformazione potrebbe essere più complessa, dalla convalida dei valori di input, al risultato della richiesta di elaborazione preliminare o al popolamento di 1-1 o 1-to-many relazioni se il database non lo farà automaticamente. Quindi, chi dovrebbe fare questo tipo di operazioni? Il modello o il controller?

Nel mio caso, se il modello lo sta facendo il codice perderebbe la sua riusabilità, perché nel mio esempio il campo _id è stato rimosso, e potrebbe essere necessario un codice back-end interno. Avrei quindi bisogno di creare un'altra funzione, che sarebbe un po 'più complicata. Inoltre, il mio controller sarebbe piccolo in termini di linee di codice rispetto al modello. Inoltre, ciò aumenterebbe l'accoppiamento tra il datastore e l'app e, se volessi fornire un provider di database diverso in base alle esigenze dell'utente, avrei bisogno di duplicare il codice di trasformazione.

D'altra parte, se il controller lo sta facendo perderei tutti i miei passaggi di trasformazione o le convalide degli input.

E riguardo la gestione degli errori? Ecco un esempio di un corpo di ritorno previsto (nei miei test, che ho scritto prima di scrivere l'API) in caso di una voce duplicata nel controller:

 {
    success: false,
    status: 400,
    data: {
      error_message: 'A config entry already exists with this key',
      error_code: 'EDUPENTRY'
    }
  }

Chi dovrebbe generare questo oggetto? Il controller o il modello?

    
posta Vinz243 01.10.2016 - 21:05
fonte

0 risposte

Leggi altre domande sui tag