Javascript 环球地产速递有限公司;车把

Javascript 环球地产速递有限公司;车把,javascript,node.js,express,handlebars.js,Javascript,Node.js,Express,Handlebars.js,我在NodeJS应用程序中使用handlebar(使用express3 handlebar)作为模板,使用Passport进行身份验证。一切都很好,但我想知道是否有办法将Passport创建的req.user对象全局传递给Handlebar 因此,我的标题部分可能如下所示: <header> <h1>My Title</h1> {{#if user}} <p>Hello {{user.name}}</p>

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

因此,我的标题部分可能如下所示:

<header>
    <h1>My Title</h1>
    {{#if user}}
        <p>Hello {{user.name}}</p>
    {{else}}
        <p>Please <a href='/login'>Log In</a></p>
    {{/if}}
</header>
这似乎是一种错误的方式,因为我在每个页面上都需要它,我能不能只设置一次,让所有页面都可以访问它

当我实例化Handlebar时,我不能这样做,因为它依赖于使用Passport登录的用户,但情况并非总是如此


创建全局“page_options”对象,将其附加并传递到每个渲染是正确的解决方案吗?还是Handlebar/Express有办法处理这个问题?

我以前没有亲自使用过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);
});
Express 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.locals
res.locals
,以及你传递到渲染函数(第二个参数)中的局部变量都被合并并传递给你的视图引擎。

太棒了!我没有想到这个功能可能在express配置中。非常感谢。嘿,我正在使用Express4.x,但这段代码对我不起作用。我想他们删除了4.x中的app.config()。你知道我如何在Express4.x上实现这一点吗?没错,
configure
在Express4中被删除了!我已经更新了(但没有测试)上面的代码,所以你应该能够在剩下的路由逻辑之前使用它。感谢Express 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();
});