与几乎所有Web应用程序一样,我需要一种方法来引用node.js应用程序中的当前用户。
我的登录/会话系统正常运行,但我今天注意到,当我在一个浏览器中登录我的应用程序并在另一个浏览器中查看时,我可以看到我在第一个浏览器中看到的相同数据。
我目前正在全局app.current_user对象中存储有关当前用户的信息,但我现在意识到这是在所有请求/会话中共享的,因为node.js是单线程的 - 因此,这是一个坏主意
将引用存储到当前用户的正确方法是什么?当前用户不仅仅是用户数据的哈希,而是Mongoose模型,所以我想存储在cookie中不是一个好主意?
顺便说一句 - 我还存储了用户的设置以及我每次与用户及其设置(在单个请求中可能发生几次)时不想再次获取的一些内容。我想你可以说我正在缓存当前用户的内存。
答案 0 :(得分:1)
目前存储当前用户信息的正确位置似乎在请求对象中。
如果您不喜欢将请求对象传递给mongoose或其他模块的想法,那么您需要在路由器/控制器/中间件中进行任何更改。例如,我可以在lastModifiedBy
Post
操作中为posts_controller
模型设置update()
用户ID。
您还可以尝试使用相当新的domain
功能来存储当前用户数据,但在使用Mongoose时,它还没有帮助,因为Mongoose还不支持域:https://github.com/LearnBoost/mongoose/pull/1337 < / p>
答案 1 :(得分:0)
在快递中你可以使用会话
//To set up session
app.use(express.cookieParser());
app.use(express.session({secret: 'secret pass', store: sessionStore}));
//To use it
req.session = {user:name , model:mongo_model};
console.log(req.session.user);
实施例
答案 2 :(得分:0)
由于已经实现了会话,因此将中间件放置在所有路由之前,该中间件可以找到当前登录的用户并将其存储在res.locals中。这使用户数据可用于所有路由,您可以在应用程序的任何位置(如下所示)访问该路由。
else if 部分用于记住我的功能。此功能根据是否存在秘密将记住令牌和用户ID存储在cookie对象/ signedCookie对象中。
app.use(function(req, res, next){
if (req.session.userId){
User.findById(req.session.userId, function(err, u){
res.locals.currentUser = res.locals.currentUser || u
next()
})
}else if (req.signedCookies.userID){ // if the user previously checked remember me
User.findById(req.signedCookies.userID, function(err, u){
if (u && u.authenticated(req.signedCookies.rToken, u.rememberDigest)){
req.session.userId = u._id // re logs in user by resetting session
res.locals.currentUser = res.locals.currentUser || u
next()
}
})
}
})
受到Micheal Hartl的Rails书的启发