如何保持express req.session对象?

我对学习Node和Express非常陌生,而且我仍然试图用代码来绕过代码stream。 假设我们在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模式。 我觉得奇怪的是session.user分配:

 req.session.user = user; 

由于reqvariables在redirect之后会超出范围,但是我们显然正在做这个来保存用户数据,所以我只想知道下面的哪个场景描述了正在发生的事情。 (A)被分配给req参数的参数(当调用callback时)被存储在/仍然在堆栈上的某个地方,(B)会话被存储在堆栈上并被分配给一个新的req对象(C)与B相同,但在用户领域(似乎不太可能,也许在我的部分)。

有一个全面的会话数据结构,存储所有的会话信息(像全局的,但它也可以在数据库中 – 只是至less在整个连接持久性的东西)。 每个客户端的会话数据使用一个唯一的键索引到会话存储中,以获取该客户端的会话数据。

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

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

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

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