2013-02-24 64 views
19

是否可以通过快递中间件或其他方法向应用程序路由中的每个呼叫添加渲染数据(res.render中的第二个选项)。Node.js Express3 - 将渲染数据添加到所有渲染请求的中间件

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

目前我对res.render的每个调用看起来都差不多。我想删除用户:req.user并将其添加到中间件功能。

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

// Page 2 
res.render("somepage2",{data : "somepage2", user : req.user}); 
+0

相关?:[上每个HTTP请求执行钩,app.get()之前和app.post()?(http://stackoverflow.com/questions/13106300 ) – laggingreflex 2014-01-12 16:36:19

回答

27

快递确实提供app.localsres.locals,它automatically merges与当地人明确由路由处理中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(); 
}); 
+0

我试过的第一件事,不起作用。 res.render是该方法中断的对象的一部分。 – 2013-02-24 23:25:28

+0

你必须通过['call'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call)保存'render'的上下文。 – josh3736 2013-02-24 23:26:30

+0

我明白了,那么我猜这会奏效。通过当地人找到另一种方式,这可能是更正确的方式。谢谢! – 2013-02-24 23:28:21

9

想通了。

您可以在您的中间件中使用本地人。

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>

+5

你实际上不应该在模板中使用'_locals'。 Express [自动将该内部变量合并到顶层对象](https://github.com/visionmedia/express/blob/3.1.0/lib/application.js#L467-474)。 – josh3736 2013-02-24 23:37:30