2013-02-24 11 views
19

È possibile tramite middleware espresso o un altro metodo per aggiungere dati di rendering (la seconda opzione in res.render) a ogni chiamata nei percorsi delle app.Node.js Express3 - Middleware per aggiungere dati di rendering a tutte le richieste di rendering

La mia app utilizza il passaporto per l'autenticazione e vorrei che un middleware aggiungesse sempre le informazioni dell'utente a ciascun modello renderizzato.

Attualmente ognuna delle mie chiamate a res.render è simile a. Vorrei rimuovere l'utente: req.user e aggiungerlo a una funzione middleware.

// Page 1 
res.render("somepage1",{data : "somepage1", user : req.user}); 

// Page 2 
res.render("somepage2",{data : "somepage2", user : req.user}); 
+0

corrispondenti ?: [Esegui gancio a ogni richiesta HTTP, prima app.get() e app.post()?] (Http://stackoverflow.com/questions/13106300) – laggingreflex

risposta

27

Express non fornire app.locals e res.locals, che automatically merges con i locali espliciti passati alla render da un gestore di percorso.

app.use(function(req, res, next) { 
    res.locals.user = req.user; 
    next(); 
}); 

alternativa, è possibile correggere la funzione hot render. Eviterei questo dal momento che è in testa in più, ma se per qualche motivo avete bisogno di passare informazioni non disponibili prima del tuo gestore di percorso si snoda, si tratta di un'opzione:

app.use(function(req, res, next) { 
    var render = res.render; 
    res.render = function(view, locals, cb) { 
     if (typeof locals == 'object') locals.user = req.user; 
     render.call(res, view, locals, cb); 
    }; 
    next(); 
}); 
+0

La prima cosa che ho provato, non funziona. res.render è parte di un oggetto che tale metodo interrompe. –

+0

Devi conservare il contesto di 'render' tramite [' call'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call). – josh3736

+0

Vedo, quindi immagino che funzionerebbe. Ho trovato un altro modo attraverso i locali che è probabilmente il modo più corretto di farlo. Grazie! –

9

capito.

È possibile utilizzare i locali nel proprio middleware.

app.use(function(req, res, next){ 
    res.locals.user = req.user; 
    next(); 
    }); 

Poi nei modelli usano.

<h1>User Name:{{user.name}}</h1> 

<h1>User Name:{{_locals.user.name}}</h1>

+5

In realtà non dovresti usare' _locals' nel template. Express [unisce automaticamente tale variabile interna nell'oggetto di livello superiore] (https://github.com/visionmedia/express/blob/3.1.0/lib/application.js#L467-474). – josh3736

Problemi correlati