我应该将当前用户存储在node.js中的哪个位置?

时间:2013-03-25 18:58:42

标签: node.js express

与几乎所有Web应用程序一样,我需要一种方法来引用node.js应用程序中的当前用户。

我的登录/会话系统正常运行,但我今天注意到,当我在一个浏览器中登录我的应用程序并在另一个浏览器中查看时,我可以看到我在第一个浏览器中看到的相同数据。

我目前正在全局app.current_user对象中存储有关当前用户的信息,但我现在意识到这是在所有请求/会话中共享的,因为node.js是单线程的 - 因此,这是一个坏主意

将引用存储到当前用户的正确方法是什么?当前用户不仅仅是用户数据的哈希,而是Mongoose模型,所以我想存储在cookie中不是一个好主意?

顺便说一句 - 我还存储了用户的设置以及我每次与用户及其设置(在单个请求中可能发生几次)时不想再次获取的一些内容。我想你可以说我正在缓存当前用户的内存。

3 个答案:

答案 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);

实施例

  1. 查看简单示例here
  2. 了解如何在此question
  3. 中将会话数据用于mongostore

答案 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书的启发