2017-07-05 58 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

相关问题