我在nodejs中使用express,并且我试图让我的视图呈现干燥。在我的布局中,我有类似下面的东西(我正在使用玉)
body
nav.login
-if(currentUser)
="logged in information"
-else
="logged out information"
!=body
问题在于,每次渲染时,我现在都需要
res.render('anything.jade',{
locals: {
currentUser: req.session.currentUser,
/*all of my other locals*/
}
});
如果我必须在布局中添加任何其他本地,那么必须完成所有渲染调用并添加它,然后执行相同的操作似乎很痛苦。是否有某种方法可以避免重新键入'currentUser'到我渲染的本地人
答案 0 :(得分:9)
我知道这个答案已经很晚了,但对于后人来说:如果你使用express,你应该使用提供的动态助手,它们是视图可访问的辅助函数,它以req,res
为参数。在你的情况下:
app.dynamicHelpers({
user: function(req, res){
return req.session.currentUser;
}
});
这意味着您的观点现在可以调用#{user}
答案 1 :(得分:2)
我最终做了以下事情:
首先,我设置了一些局部变量
app.use(function(req,res,next){
req.localvars = new Object;
next();
});
之后,我设置了一些局部变量
app.use(function(req,res,next){
req.localvars.currentUser = req.session.currentUser;
next();
});
我设置了渲染功能
function renderer(file){
return function(req,res,next){
res.render(file,{locals:req.localvars});
}
}
然后是路由功能
app.get('/',blah,blah,whatever,setSomeMoreLocalsHere,renderer(index.jade));
可能有更好的东西,但这是我迄今为止已经找到的最佳解决方案
答案 2 :(得分:0)
最简单的解决方案是使用返回本地对象的函数。
function(req) {
return {
currentUser: req.session.currentUser,
/*all of my other locals*/
};
}
res.render('anything.jade',{
locals: defaultLocals(req)
});