2014-02-26 31 views
5

我正在使用Handlebars(使用express3-handlebars)模板和Passport進行NodeJS應用程序中的身份驗證。所有工作都很好,但我想知道是否有辦法將Passport創建的req.user對象全局傳遞給Handlebars。Express&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有辦法處理這個問題?

回答

7

我以前沒有親自使用Passport,但是基於Passport自述文件以及我對其他身份驗證方案所做的工作,這應該可行。

快遞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); 
}); 

Express 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,和當地人之前傳遞到渲染功能(第二個參數)全部得到組合並傳遞給你的視圖引擎。

+0

太棒了!我沒有想到這個功能可能是快速配置。非常感謝。 – lewis

+0

嘿,我正在使用Express 4.x,此代碼不適用於我。我認爲他們刪除了4.x中的app.config()。有關如何在Express 4.x上實現這一點的任何想法? – codeinprogress

+0

你說得對,'configure'在Express 4中被刪除了!我更新了(但未經測試)上面的代碼,所以您應該能夠在其他路由邏輯之前使用它。 – ZachRabbit