Express&Handlebars全球物业

我使用Handlebars(使用express3-handlebars)模板和Passport在NodeJS应用程序中进行身份validation。 所有的工作都很好,但是我想知道是否有办法将Passport创build的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时,我无法做到这一点,因为它取决于用户使用Passportlogin,这并不总是如此。

创build一个全局的“page_options”对象,附加并传递给每个渲染是正确的解决scheme还是Handlebars / Express有办法处理这个问题?

       

网上收集的解决方案 "Express&Handlebars全球物业"

我之前没有亲自使用Passport,但是基于Passport自述文件以及我使用其他身份validationscheme所做的工作,这应该可行。

快递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和你传入渲染函数(第二个参数)的locals都被合并,并传递给你的视图引擎。