我想在呈现Express模板之前(当调用res.render时)挂钩部分,这样我就可以做一些事情,比如从res.
到res.locals.
分配适当的东西,使其可用于模板。例如,执行res.locals.user = res.user
。
标准中间件对此不够好,因为它在所有内容之前运行,因此在这种情况下user
尚不可用。现在我必须分别在每个路线功能中执行此操作。
res.locals.user = res.user;
res.render('template.html', context);
此时挂钩对于像i18n等一样有用。
答案 0 :(得分:0)
您可以使用像这样的自定义渲染功能
function render(res) {
res.locals.user = res.user;
res.render('template.html', context);
}
答案 1 :(得分:0)
标准中间件对此不够好,因为它运行起来 在一切之前
这是不对的,您可以在链中定义放置中间件的位置,即(使用passport
):
//passport setup
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done) {
...
});
passport.deserializeUser(function(usr, done) {
...
});
// set locals
app.use(function(req, res, next) {
// req.user is available
res.locals.user = req.user;
next();
});
在这种情况下,passport.session()
中间件将改变req
对象,以便通过passport.deserializeUser
fn对用户进行反序列化,使req.user
在链中的任何位置都可用。