25

是否可以通过快速中间件或其他方法将渲染数据(中的第二个选项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});
4

2 回答 2

35

Express 确实提供了app.localsand res.locals,它会自动render与路由处理程序传入的显式本地合并。

app.use(function(req, res, next) {
    res.locals.user = req.user;
    next();
});

或者,您可以热修补该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();
});
于 2013-02-24T23:23:54.717 回答
11

弄清楚了。

您可以在中间件中使用本地变量。

  app.use(function(req, res, next){
    res.locals.user = req.user;
    next();
  });

然后在模板中使用。

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

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

于 2013-02-24T23:27:19.750 回答