Secar a los lugareños de diseño en la representación de expressjs
Pregunta
Estoy usando Express en NodeJs, y estoy tratando de mantener mi punto de vista seca. Dentro de mi diseño, tengo algo como lo siguiente (estoy usando jade)
body
nav.login
-if(currentUser)
="logged in information"
-else
="logged out information"
!=body
El problema es que cada vez que me represento, ahora tengo que tener
res.render('anything.jade',{
locals: {
currentUser: req.session.currentUser,
/*all of my other locals*/
}
});
Parece un dolor tener que pasar por todas mis llamadas de representación y agregar eso, y luego hacer lo mismo si tengo que agregar cualquier otro lugareño al diseño. ¿Hay alguna forma de evitar tener que volver a escribir 'CurrentUser' en los lugareños en todas partes donde me represento?
Solución
Sé que esta respuesta llega tarde, pero para la posteridad: si está utilizando Express, debe usar los ayudantes dinámicos suministrados, que son funciones auxiliares accesibles para la vista que toman req,res
como argumentos. En tu caso:
app.dynamicHelpers({
user: function(req, res){
return req.session.currentUser;
}
});
Lo que significa que su punto de vista ahora podría llamar #{user}
Otros consejos
Terminé haciendo lo siguiente:
Primero, configuré algunas variables locales
app.use(function(req,res,next){
req.localvars = new Object;
next();
});
Más tarde, establecí algunas variables locales
app.use(function(req,res,next){
req.localvars.currentUser = req.session.currentUser;
next();
});
Configuré una función de render
function renderer(file){
return function(req,res,next){
res.render(file,{locals:req.localvars});
}
}
luego para la función de enrutamiento
app.get('/',blah,blah,whatever,setSomeMoreLocalsHere,renderer(index.jade));
Puede haber algo mejor, pero es la mejor solución que he descubierto hasta ahora
La solución más fácil sería utilizar una función que devuelva un objeto local.
function(req) {
return {
currentUser: req.session.currentUser,
/*all of my other locals*/
};
}
res.render('anything.jade',{
locals: defaultLocals(req)
});