Node.js Express3 - 用于向所有渲染请求添加渲染数据的中间件

Ada*_*luk 23 node.js express

是否可以通过快速中间件或其他方法将res.render应用程序路径中的每个调用添加渲染数据(第二个选项).

我的应用程序使用护照进行身份验证,我希望中间件始终将用户信息附加到每个呈现的模板.

目前我的每个电话res.render看起来都差不多.我想删除user : req.user并添加到中间件功能.

// Page 1
res.render("somepage1",{data : "somepage1", user : req.user});

// Page 2
res.render("somepage2",{data : "somepage2", user : req.user});
Run Code Online (Sandbox Code Playgroud)

jos*_*736 34

快递确实提供了app.localsres.locals,它会自动合并有明确的当地人中通过render由路由处理.

app.use(function(req, res, next) {
    res.locals.user = req.user;
    next();
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以热修补该render功能.我想避免这种情况,因为它是额外的开销,但如果由于某种原因,你需要你的路由处理程序运行之前传递信息不可用,这是一个选项:

app.use(function(req, res, next) {
    var render = res.render;
    res.render = function(view, locals, cb) {
        if (typeof locals == 'object') locals.user = req.user;
        render.call(res, view, locals, cb);
    };
    next();
});
Run Code Online (Sandbox Code Playgroud)


Ada*_*luk 10

弄清楚了.

您可以在中间件中使用本地.

  app.use(function(req, res, next){
    res.locals.user = req.user;
    next();
  });
Run Code Online (Sandbox Code Playgroud)

然后在模板中使用.

<h1>User Name:{{user.name}}</h1>
Run Code Online (Sandbox Code Playgroud)

<h1>User Name:{{_locals.user.name}}</h1>

  • 实际上你不应该在模板中使用`_locals`.Express [自动将该内部变量合并到顶级对象](https://github.com/visionmedia/express/blob/3.1.0/lib/application.js#L467-474). (5认同)