如何创建在res.render(模板渲染)之前运行的Express中间件?

时间:2015-11-01 10:55:43

标签: javascript node.js express

我想在呈现Express模板之前(当调用res.render时)挂钩部分,这样我就可以做一些事情,比如从res.res.locals.分配适当的东西,使其可用于模板。例如,执行res.locals.user = res.user

标准中间件对此不够好,因为它在所有内容之前运行,因此在这种情况下user尚不可用。现在我必须分别在每个路线功能中执行此操作。

res.locals.user = res.user;
res.render('template.html', context);

此时挂钩对于像i18n等一样有用。

2 个答案:

答案 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在链中的任何位置都可用。