Javascript express req.session对象是如何持久化的?

Javascript express req.session对象是如何持久化的?,javascript,node.js,session,express,Javascript,Node.js,Session,Express,我对学习Node和Express非常陌生,我仍在尝试用Express来理解代码流。假设我们在session.js中有这样的代码: app.post('/session', notLoggedIn, function(req, res) { User.findOne({ username: req.body.username, password: req.body.password }, function (err, user) {

我对学习Node和Express非常陌生,我仍在尝试用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');
        }
    }); 
});
假设用户是必需的mongo模式。我觉得奇怪的是会话。用户分配:

req.session.user = user;

由于req变量在重定向后将超出作用域,但我们显然这样做是为了持久化用户数据,所以我只需要弄清楚以下哪种情况描述了正在发生的情况。要么(A)分配给req参数的参数(调用回调时)存储在堆栈上,要么(B)会话存储在堆栈上,并在传入回调之前分配给新的req对象,要么(C)与B相同,但在用户字段上(看起来不太可能,可能是我自己设计的).

有一个整体会话数据结构,它存储所有会话信息(比如全局会话,但也可以在数据库中—至少在连接之间是持久的)。每个客户端的会话数据都使用一个唯一的键索引到会话存储中,以获取该客户端的会话数据

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

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

下面是一个典型的序列:

  • 传入的HTTP请求
  • 中间件检查会话cookie
  • 如果会话cookie不存在,则创建一个,并在此过程中创建一个唯一的id来标识此http客户端
  • 在持久会话存储中,初始化此新客户端的会话
  • 如果存在会话cookie,则在会话存储中查找此客户端的会话数据,并将该数据添加到请求对象
  • 会话结束中间件处理
  • 稍后在这个http请求的快速处理过程中,它会得到一个匹配的请求处理程序。此特定http客户端的会话存储中的会话数据已附加到请求对象,并可供请求处理程序使用

  • 我会看一下代码,代码不多,而且似乎有很好的文档记录。我们可以聊天吗?我没有什么疑问,一点帮助对我来说将是一个巨大的好处。@SurajJain-这个网站不是这样工作的。如果你有一个关于这是如何工作的问题,你可以自己发布一个新问题,详细说明你需要帮助理解什么。我以前经常这样做,人们只会拒绝投票,这就是为什么我现在在聊天中提问,聊天,完全理解,然后在这个网站上回答问题,并传播知识。