2015-03-13 13 views
5

Nella mia applicazione Node.js alcune variabili che rendono o ogni percorso sono comuni. Ci sono circa 4-5 variabili che rendono su ogni percorso. E ho circa 20 rotte.come rendere variabili comuni da app.js a tutte le rotte in express

Attualmente sto facendo passare quelle variabili in ogni percorso in res.render

Esiste un metodo con il quale posso passare queste variabili comuni in qualche luogo '(ad esempio: app.js) `, che viene utilizzato da tutti i percorso, in modo da poter pulire un po 'il mio codice.

Io uso express.js per il nodo e handlebars per modello.

EDIT: penso che dovrei spiegare un po 'di più

res.render('abc', { 
         commonitem1: 'one', 
         commonitem2: 'two', 
         ... 
        }); 

------------------------------------- 
another route 
res.render('xyz', { 
         commonitem1: 'one', 
         commonitem2: 'two', 
         ... 
        }); 

voglio evitare questo di ripetere in ogni miei percorsi e vogliono renderlo da un luogo comune.

+0

Penso che si possa usare questo: 'app.set (" someOptions "," value "); 'e recupera con' app.get ("someOption"); ' – GeekRiky

risposta

6

Per la sessione o richiedere valori dipendenti è possibile memorizzare i valori comuni in una variabile globale e quindi utilizzarli direttamente in res.render . Per fare questo avete seguenti opzioni

  • Usa app.use per memorizzare i valori:

Nelle tue app.js aggiungere un middleware che fa questo per voi. Ricordarsi di scrivere questo middleware prima di qualsiasi altro percorso definito poiché le funzioni del middleware vengono eseguite in sequenza.

app.use(function(req, res, next){ 
    res.locals.items = "Value"; 
    next(); 
}); 
//your routes follow 
app.use(‘/’, home); 

Nei tuoi percorsi è possibile inserire direttamente in items res.render come:

res.render('layout', {title: 'My awesome title',view: 'home', item :res.locals.items }); 
  • utilizzare Express-sessione per memorizzare i valori:

Se si è espresso sessione installato è possibile salvare alcuni dati in req.session.item e metterli in qualsiasi percorso come:

res.render('layout', {title: 'My awesome title',view: 'home', item :req.session.items }); 
+0

Il mio problema non sta ottenendo valore in ogni percorso. Sto ottenendo da un file globale in cui ho impostato le variabili comuni. Ma per ottenere il valore nel mio modello lo sto passando in ogni 'res.render' di ogni percorso. Voglio evitarlo e farlo da un posto comune. – zamil

+0

Capisco il tuo problema; vuoi che alcuni elementi comuni, come il menu della barra laterale, nei tuoi layout vengano generati una volta utilizzati in più pagine senza richiedere valori. Quindi qualcosa di simile, visualizzando "homepage" convegni "sidebar" che recupera i valori richiesti e viene incorporato nella "homepage". (Pensaci) –

+1

Usa 'res.locals'. Crea una funzione che viene chiamata prima dei percorsi che richiedono variabili comuni. In quella funzione assegna un valore a "res.locals.varname'. Nei tuoi layout ora puoi usare 'varname'. –

4

Sembra che res.locals sia quello che stai cercando: questo oggetto viene passato alle tue visualizzazioni per ogni richiesta ed è impostato su ogni singola richiesta (ad esempio, ciascuna richiesta può avere una propria versione di res.locals). C'è anche app.locals che è condiviso per tutte le richieste.

Non ho esperienza pratica con questo, ma è possibile utilizzare questo oggetto per passare tutti variabili per le vostre opinioni o forse espresso si fonderà tutto ciò che è in app.locals con res.locals e ciò che si invia alla visualizzazione tramite res.render(). Si prega di testare attentamente, non ho trovato informazioni rilevanti sul comportamento di fusione nei documenti ufficiali.

Come per il popolamento del res.locals, per mantenere il codice DRY, è possibile scrivere un custom middleware che compila l'oggetto con qualsiasi cosa sia necessario prima che venga eseguita la logica del percorso reale.

+0

Grazie per avermi presentato a res.locals :) – zamil

0

È possibile creare un file constants.js con codice qui sotto

(function (constants) { 
    var FetchDataErrorMessage = "Error while fetching User Data"; 
    var ConnectionErroMessage = "Error while fetching Connecting Server"; 
    var InsertDataErrorMessage = "Error while inserting User Data"; 
    var RemoveDataErrorMessage = "Error while removing User Data"; 
    var UpdateDataErrorMessage = "Error while updating User Data"; 
})(module.exports); 

In ogni file in cui è necessario utilizzare le variabili che si possono aggiungere al di sotto del codice.

var constants = require('constants');  
console.write(constants.RemoveDataErrorMessage); 

uscita: - "Errore durante la rimozione User Data"

+0

Non stai esportando nulla ... Si noti inoltre che non è necessario in Node.js includere i moduli in [IIFE] (http://en.wikipedia.org/wiki/Immediately-invoked_function_expression) s, il nodo lo fa per te. –

Problemi correlati