【问题标题】:Global properties in Express & HandlebarsExpress & Handlebars 的全球物业
【发布时间】:2014-03-29 04:44:15
【问题描述】:

我在 NodeJS 应用程序中使用 Handlebars(使用 express3-handlebars)作为模板,使用 Passport 进行身份验证。一切都很好,但我想知道是否有办法将 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 有办法处理这个问题?

【问题讨论】:

    标签: javascript node.js express handlebars.js


    【解决方案1】:

    我以前没有亲自使用过 Passport,但根据 Passport README 和我对其他身份验证方案所做的工作,这应该可以工作。

    快递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 和您传递给渲染函数(第二个参数)的局部变量都会组合在一起并传递给您的视图引擎。

    【讨论】:

    • 太棒了!我没有想到这个功能可能在快速配置中。非常感谢。
    • 嘿,我正在使用 Express 4.x,此代码对我不起作用。我认为他们在 4.x 中删除了 app.config()。关于如何为 Express 4.x 实现此功能的任何想法?
    • 你说得对,configure 在 Express 4 中被删除了!我已经更新(但未测试)上面的代码,所以你应该能够在其余的路由逻辑之前使用它。
    • 感谢 Express 4 编辑。我一直在寻找这个解决方案。
    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多