[英]Express Middleware to populate a Jade variable for all app.get()'s
我有一个Jade文件,我的所有模板都扩展名为layout.jade。 在其中我希望能够在用户当前登录时具有注销按钮(这在req.session中保持跟踪)。
所以layout.jade会有类似的东西,
-if (loggedin)
a.navButton(href="/logout") Log Out
页面的路径看起来像,
app.get("/foo", function(req, res) {
res.render("foo", {loggedin: req.session.isValidUser});
});
问题是,我不想在每个路由中手动填充登录变量。 有没有办法可以使用Express中间件自动为发送到res.render的对象设置一些默认选项? 或者有更好的方法来做到这一点?
基本上我问我怎样才能将一些变量总是发送到模板,以及通过在路径中手动设置某些模板中某些自定义变量的功能。
看起来这实际上是一个我很难找到的记录功能,除非有人有更好的方法去做; 从最新的Express文档中 ,
app.locals :应用程序局部变量提供给应用程序中呈现的所有模板 。 这对于为模板提供辅助函数以及应用程序级数据非常有用。
所以在我的登录成功函数中,
req.session.username = profile.username;
app.locals.username = profile.username;
我的退出功能,
app.get('/logout', function (req, res) {
delete app.locals.username;
req.session.destroy();
res.redirect('/login');
});
最后在layout.jade /我的所有模板中,
- if(username)
a.navButton(href="/logout") Logout
如果你在/login
路由中设置res.locals.loggedin
,正如hexacyanide建议的那样,这个本地将不会在/foo
的路由中可用。 每次请求都会清除res.locals
。
您可以尝试将其置于其他路线之上:
app.all('*', function(req, res, next){
if(req.user){
res.locals.loggedin = true;
res.locals.currentuser = req.user;
};
next();
});
非常确定如果在路由期间修改req.user,则之前设置的res.locals.currentuser
将不会更新为新的req.user
。 但不确定。
我实际上为每个渲染模板的页面使用自定义render
功能,它看起来像这样:
function myRender(templateName){
return function(req, res){
res.locals.currentuser = req.user || null;
res.render(templateName);
};
};
我这样使用它:
app.get('/foo'
, function(req, res, next){
res.locals.bar = req.query['bar'] || "";
console.log('passing request to myRender middleware');
next();
}
, myRender('foo-jade-template')
)
这样做的好处是,当我准备渲染某些内容时,而不是在执行我的路由之前,只设置res.locals.currentuser
。 因此,如果我更改req.user
,则保证在渲染时具有最新版本。
在Express源代码中有一行对您非常有用的代码:
// merge res.locals
options._locals = self.locals;
因此,当您运行res.render()
,Express还将获取存储在res.locals
所有本地res.locals
并将它们传递给渲染。 因此,您所要做的就是将res.locals.loggedin
设置为true,然后像往常一样运行res.render()
。
app.get('/login', function(res, res) {
res.locals.loggedin = true;
});
app.get('/foo', function(req, res) {
res.render('foo', {});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.