2017-07-05 54 views
0

我想查找已登錄的用戶,並將其信息設置爲app.locals,以便我可以在任何視圖中使用它。如何在Mongoose中使用.findOne的app.locals

我像這樣設置它在我的server.js文件:

app.use(ensureAuthenticated, function(req, res, next) { 
    User.findOne({ _id: req.session.passport.user }, (err, user) => { 
    console.log('user\n', user) 
    app.locals.logged_in_user = user; 
    next(); 
    }) 
}); 

console.log('user\n', user)確認該用戶已被發現。 然後,我應該能夠在任何部分,使用該用戶的信息,如在我layout.hbs文件像這樣:

Currently, {{logged_in_user}} is logged in. 

但是,它不工作。回答here建議使用res.locals來代替,但這並不奏效。這個例子here使用靜態數據,但我需要動態數據,因爲user將取決於誰在。

記錄現在,我在每一個路線定義user變量。有沒有一種方法來全局定義一個user變量,可用於任何部分?

+1

「res.locals」是添加動態信息的正確對象,「app.locals」僅用於靜態(僅設置一次)信息。您的中間件是否在呈現模板的路由之前聲明?在這些路由中,在調用'res.render()'之前,'res.locals.logged_in_user'的值是什麼? – robertklep

+0

我剛剛拿出'ensureAuthenticated',它工作。但是,謝謝你的回覆! – Farid

+1

不過,不要使用'app.locals'。或者,如果你這樣做,期望你在任何時候都只能有一個活躍用戶。 – robertklep

回答

2

您正在使用護照來判斷代碼。該documentation狀態如下:

如果驗證成功,接下來的處理程序將被調用和req.user屬性將被設置爲通過驗證的用戶。

因此,你可以做以下(或無論你想這樣做):

app.use((req, res, next) => { 
    res.locals.user = req.user 
    next() 
} 

這將通過用戶對象的所有要求和意見。

+0

感謝您的回覆。是的,我正在使用護照。我認爲如果我沒有在數據庫中查找用戶,你的答案是有意義的。但是,我運行'User.findOne'來查看我的數據庫中的用戶。然後我想將從db返回的用戶對象傳遞給'res.locals'變量。因此,app.use((req,res,next)=> User.findOne({_id:req.session.passport.user},(err,user)=> res.locals.logged_in_user = user ; next(); }) });' – Farid

+0

@使用正確的Passport設置,'passport.deserializeUser'已經查找了用戶。 – robertklep

+0

取出'ensureAuthenticated'工作。多謝你們。 – Farid

相關問題