在expressjs渲染中干燥布局本地化
我在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*/ } });
看起来像是一个痛苦,必须通过所有的渲染调用,并添加,然后做同样的事情,如果我必须添加任何其他当地人的布局。 有什么办法可以避免在我渲染的任何地方重新input“currentUser”到当地人
我知道这个答案已经晚了,但是对于后人来说:如果你使用express,你应该使用提供的dynamic助手,这些助手是视图可访问的帮助函数,它们将req,res
作为参数。 在你的情况下:
app.dynamicHelpers({ user: function(req, res){ return req.session.currentUser; } });
这意味着您的视图现在可以调用#{user}
我结束了以下工作:
首先,我设置了一些局部variables
app.use(function(req,res,next){ req.localvars = new Object; next(); });
后来,我设置了一些局部variables
app.use(function(req,res,next){ req.localvars.currentUser = req.session.currentUser; next(); });
我设置了渲染function
function renderer(file){ return function(req,res,next){ res.render(file,{locals:req.localvars}); } }
然后是路由function
app.get('/',blah,blah,whatever,setSomeMoreLocalsHere,renderer(index.jade));
可能有更好的,但这是迄今为止我已经发现的最好的解决scheme
最简单的解决scheme是使用返回本地对象的函数。
function(req) { return { currentUser: req.session.currentUser, /*all of my other locals*/ }; } res.render('anything.jade',{ locals: defaultLocals(req) });