express req.session对象是如何保持的?

Nic*_*olk 17 javascript session node.js express

我是学习Node和Express的新手,我仍然试图用快速包围代码流.假设我们在session.js中有这样的代码:

app.post('/session', notLoggedIn, function(req, res) {
    User.findOne({
        username: req.body.username, 
        password: req.body.password
    }, function (err, user) {
        if (err) {
            return next(err);
        }
        if (user) {
            req.session.user = user;
            res.redirect('/users');
        } else {
            res.redirect('/session/new');
        }
    }); 
});
Run Code Online (Sandbox Code Playgroud)

假设User是必需的mongo架构.我发现奇怪的是session.user赋值:

req.session.user = user;
Run Code Online (Sandbox Code Playgroud)

由于req变量在重定向后将超出范围,但我们显然是这样做是为了持久保存用户数据,我只想弄清楚以下哪个场景描述了正在发生的事情.(A)被分配给req参数的参数(当调用回调时)被存储/仍在堆栈中的某个地方,(B)会话存储在堆栈上并被分配给新的req对象之前传入回调,或(C)与B相同,但在用户字段上(似乎不太可能,也许我可能做作).

jfr*_*d00 13

存在一个整体会话数据结构,它存储所有会话信息(如全局,但它也可以在数据库中 - 只是在连接中持久存在的东西).每个客户端的会话数据使用一个唯一密钥索引到会话存储中以获取该客户端的会话数据.

为给定浏览器客户端建立会话的一部分是创建一个唯一的客户端密钥(通常存储在cookie中),该密钥成为全局会话对象的索引.

在传入的http请求中,支持会话的Express中间件检查特定的客户端cookie,如果在http请求中找到该特定的cookie并且在全局会话对象/数据库中找到,则它将该会话的存储信息添加到请求对象用于以后使用的http请求处理程序.

所以,这是一个典型的序列:

  1. 传入HTTP请求.
  2. 中间件检查会话cookie.
  3. 如果会话cookie不存在,则创建一个,并在此过程中创建一个唯一的ID来标识此http客户端.
  4. 在持久会话存储中,初始化此新客户端的会话.
  5. 如果存在会话cookie,则在会话存储中查找此客户端的会话数据,并将该数据添加到请求对象.
  6. 会话中间件处理结束
  7. 稍后在此http请求的Express处理中,它将转到匹配的请求处理程序.来自此特定http客户端的会话存储的会话数据已附加到请求对象,可供请求处理程序使用.

  • @jpaddison3 - 当您想使用当前数据更新会话存储时,您可以自己调用 `req.session.save()` ,或者当请求完成时,express-session 会为您执行此操作,并且它会注意到任何更改会议。Express-session 挂钩 `res.end()` 以查看请求何时完成,然后根据需要更新会话存储。 (4认同)
  • @SurajJain - 这不是这个网站的运作方式。如果您对它的工作原理有疑问,您可以自己发布一个新问题,其中包含有关您在理解方面需要帮助的具体细节。 (3认同)
  • 我以前就这么做过,人们只会投反对票,这就是为什么我现在在聊天中提问,聊天并完全理解,然后在这个网站上回答问题,传播知识。 (2认同)