Express Middleware为所有app.get()填充Jade变量

Phe*_*ide 7 javascript node.js express pug

我有一个Jade文件,我的所有模板都扩展名为layout.jade.在其中我希望能够在用户当前登录时具有注销按钮(这在req.session中保持跟踪).

所以layout.jade会有类似的东西,

-if (loggedin)
  a.navButton(href="/logout") Log Out
Run Code Online (Sandbox Code Playgroud)

页面的路径看起来像,

app.get("/foo", function(req, res) {
    res.render("foo", {loggedin: req.session.isValidUser});
});
Run Code Online (Sandbox Code Playgroud)

问题是,我不想在每个路由中手动填充登录变量.有没有办法可以使用Express中间件自动为发送到res.render的对象设置一些默认选项?或者有更好的方法来做到这一点?

基本上我问我怎样才能将一些变量总是发送到模板,以及通过在路径中手动设置某些模板中某些自定义变量的功能.

Phe*_*ide 7

看起来这实际上是一个我很难找到的记录功能,除非有人有更好的方法去做; 从最新的Express文档中,

app.locals:应用程序局部变量提供给应用程序中呈现的所有模板.这对于为模板提供辅助函数以及应用程序级数据非常有用.

所以在我的登录成功函数中,

req.session.username = profile.username;
app.locals.username = profile.username;
Run Code Online (Sandbox Code Playgroud)

我的退出功能,

app.get('/logout', function (req, res) {
    delete app.locals.username;
    req.session.destroy();
    res.redirect('/login');
});
Run Code Online (Sandbox Code Playgroud)

最后在layout.jade /我的所有模板中,

- if(username)
  a.navButton(href="/logout") Logout
Run Code Online (Sandbox Code Playgroud)

  • 等等,Node.js是否只为一个实例运行所有用户?我的意思是,'app.locals`不会为应用程序的每个用户引用相同的对象吗? (6认同)

Pla*_*ato 5

如果您res.locals.loggedin/login路线中设置,正如六氰化物所建议的那样,此本地在路线中将不可/foores.locals每次请求都会被清除。

您可以尝试将其置于其他路线之上:

app.all('*', function(req, res, next){
  if(req.user){
    res.locals.loggedin = true;
    res.locals.currentuser = req.user;
  };
  next();
});
Run Code Online (Sandbox Code Playgroud)

可以肯定的是,如果您在路线期间修改 req.user res.locals.currentuser,您之前设置的 不会更新为新的req.user. 但不确定。

我实际上render为我呈现模板的每个页面使用了一个自定义函数,它看起来像这样:

function myRender(templateName){
  return function(req, res){
    res.locals.currentuser = req.user || null;
    res.render(templateName);
  };
};
Run Code Online (Sandbox Code Playgroud)

我像这样使用它:

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')
)
Run Code Online (Sandbox Code Playgroud)

这样做的优点是仅res.locals.currentuser在我准备渲染某些内容时进行设置,而不是在执行我的路线之前进行设置。因此,如果我进行更改req.user,则保证在渲染时具有最新版本。