我正在使用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有办法处理这个?
答案 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.locals
,res.locals
和传递给渲染函数的本地人(第二个参数)都会被合并并传递给您的视图引擎。