Express & Handlebars 的全球物业

Posted

技术标签:

【中文标题】Express & Handlebars 的全球物业【英文标题】:Global properties in Express & 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 有办法处理这个问题?

【问题讨论】:

【参考方案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 编辑。我一直在寻找这个解决方案。

以上是关于Express & Handlebars 的全球物业的主要内容,如果未能解决你的问题,请参考以下文章

使用 Node.js、Handlebars 和 Express 进行模板继承

使用 Express Handlebars 和 Angular JS

使用 Node.js 和 express-handlebars 从 JSON 文件渲染 html

由于:TypeError:handlebars is not a function,无法设置车把

错误:Handlebars.js 中缺少帮助程序

Meteor & Handlebars:每 N 项后的新行