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.locals
、res.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