Express& amp;中的全球物业把手

时间:2014-02-26 11:28:59

标签: javascript node.js express handlebars.js

我正在使用Handlebars(使用express3-handlebars)进行模板,使用Passport进行NodeJS应用程序中的身份验证。一切都很好但我想知道是否有办法将Passport创建的req.user对象全局传递给Handlebars。

所以我的标题部分可能看起来像这样:

<header>
    <h1>My Title</h1>
    {{#if user}}
        <p>Hello {{user.name}}</p>
    {{else}}
        <p>Please <a href='/login'>Log In</a></p>
    {{/if}}
</header>

就目前而言,我必须在每个页面呈现时显式传递用户对象:

app.get('/', function(req, res){
    res.render('home', {
        page_title: 'welcome',
        user: req.user
    }); 
});

这似乎是错误的方式,因为我需要在每个页面上使用它,我不能只设置一次并让所有页面都可以访问它吗?

当我实例化Handlebars时,我无法做到这一点,因为它取决于使用Passport登录的用户,但情况并非总是如此。

创建一个全局'page_options'对象,将它附加并传递给每个渲染器是正确的解决方案还是Handlebars / Express有办法处理这个?

1 个答案:

答案 0 :(得分:9)

我以前没有亲自使用Passport,但是基于Passport自述文件以及我对其他身份验证方案所做的事情,这应该可行。

Express 3

app.configure(function() {
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(function(req, res, next) {
        res.locals.user = req.user; // This is the important line

        next();
    });
    app.use(app.router);
});

快递4

app.use(passport.initialize());
app.use(passport.session());
app.use(function(req, res, next) {
    res.locals.user = req.user; // This is the important line

    next();
});

基本上,在渲染之前,您的app.localsres.locals和传递给渲染函数的本地人(第二个参数)都会被合并并传递给您的视图引擎。