2016-04-14 17 views
2

Ich habe eine Express-Anwendung geerbt. In der Anwendung übergeben wir eine massive Liste von lokalen Variablen an res.render. Für jede Seite übergeben wir ungefähr 30 Variablen, die sich nicht ändern. Wenn man es ändert, muss es an einem Dutzend Stellen geändert werden. Das ist offensichtlich schlecht.Merge zwei JSON-Objekte auf der Serverseite

Also was ich tun möchte speichern die Werte Einheimischen, die sich nicht von den wirklich lokalen zu ändern. So stellte ich diese Werte in ihrer eigenen Datei nicht ändern und die Datei zu Beginn jeder Route laden, etwa so:

'use strict'; 
var locals = 
{ 
    indexName: 'Home', 
    ...lots more of these... 
}; 
module.exports = { locals : locals }; 


// in each route files 
var local = require('../locals.js'); 

Und ich kann es verwenden, über res.render('sensor', local.locals);

Allerdings muss ich auch hinzufügen Seitenspezifische Werte. Also habe ich versucht local.locals + { ... }; was nicht während es keinen Fehler gibt, zeigt nicht einmal die ursprünglichen Werte.

Ich habe dann versucht local.locals.concat({...}) aber das macht einen Fehler ausgeben (TypeError: Object #<Object> has no method 'concat'), ebenfalls für extend und push.

Gibt es keine Methoden zum Erweitern oder Zusammenführen von zwei Objekten? Muss ich meine eigenen rollen?

Ist dies auch der beste Weg, ein Array global zu machen? Ich würde es vorziehen, es einfach locals zu nennen, und nicht local.locals als das ist nur umständlich.

+0

'Object.assign' – mostruash

+0

Ich bekomme' TypeError: Objekt # hat auch keine Methode 'assign'' dafür. –

+0

Nachdem ich die 'Object.assign' -Dokumentation betrachtet habe, habe ich die Parameter geändert und jetzt bekomme ich' TypeError: Objekt function Object() {[native code]} hat keine Methode 'assign''. Ich werde auf lodash schauen. –

Antwort

2

Zusätzlich zu Object.assign von @mostruash, gibt es zwei JS-Bibliotheken, die sehr ähnlich sind, die beide eine Objekt-Merge-Funktion bieten (zusammen mit vielen netten Hilfsprogramme). Wählen Sie eine:

Edit: und wie auf Ihre zweite Frage zu local.locals ... natürlich exportieren nur das Objekt selbst, sondern als ein Objekt, das es umschließt:

module.exports = locals; 

... und in Ihre Routen:

var locals = require('../locals'); 
console.log(locals.indexName); 
+0

Beachten Sie, dass es möglicherweise eine bessere Idee ist, lodash zu verwenden. Quelle: https://stackoverflow.com/questions/13789618/differences-between-lodash-and-underscore – christophetd

+0

Schließlich verwendet lodash 'assign'. –