/ / Propiedades globales en Express & Handlebars - javascript, node.js, express, handlebars.js

Propiedades globales en Express & Handlebars - javascript, node.js, express, handlebars.js

Estoy usando manillares (utilizando manillares express3)para plantillas y Passport para autenticación en una aplicación NodeJS. Todo está funcionando bien, pero me pregunté si hay una manera de pasar el objeto req.user creado por Passport to Handlebars a nivel mundial.

Así que mi encabezado parcial podría verse algo como esto:

<header>
<h1>My Title</h1>
{{#if user}}
<p>Hello {{user.name}}</p>
{{else}}
<p>Please <a href="/login">Log In</a></p>
{{/if}}
</header>

Tal como está, tengo que pasar el objeto de usuario explícitamente con cada representación de página:

app.get("/", function(req, res){
res.render("home", {
page_title: "welcome",
user: req.user
});
});

Esto parece ser la forma incorrecta de hacerlo ya que lo requiero en cada página, ¿no puedo configurarlo una vez y tener acceso a todas las páginas?

No puedo hacer esto cuando ejemplifico los manillares, ya que depende de que el usuario haya iniciado sesión con Passport, lo que no siempre será el caso.

¿La creación de un objeto global de "page_options", agregarlo y pasarlo a cada renderizado sería la solución correcta o Handlebars / Express tiene una forma de manejar esto?

Respuestas

9 para la respuesta № 1

Personalmente no he usado Passport antes, pero en base al Passport README y lo que he hecho con otros esquemas de autenticación, esto debería funcionar.

Expreso 3

app.configure(function() {
app.use(passport.initialize());
app.use(passport.session());
app.use(function(req, res, next) {
res.locals.user = req.user; // This is the important line

next();
});
app.use(app.router);
});

Expreso 4

app.use(passport.initialize());
app.use(passport.session());
app.use(function(req, res, next) {
res.locals.user = req.user; // This is the important line

next();
});

Básicamente, justo antes de renderizar, su app.locals, res.locals, y los locales que pasan a la función de renderizado (el segundo argumento) se combinan y pasan a su motor de visualización.