express req.session对象如何持久化?
我对学习Node and 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模式。我发现奇怪的是session.user分配:
req.session.user = user;
由于req变量在重定向后将超出范围,但是我们显然是在执行此操作以保留用户数据,因此我需要弄清楚以下哪种情况描述了正在发生的情况。(A)被分配给req参数的参数(在调用回调时)被存储/仍在堆栈中的某个位置,(B)会话被存储/在堆栈中,并在分配给新的req对象之前被分配传递给回调函数,或(C)与B相同,但在用户字段上使用(似乎不太可能,可能是我做的)。
回答:
这里有一个整体会话数据结构,用于存储所有会话信息(例如全局的,但也可以存储在数据库中-
至少在连接之间是持久的)。每个客户端的会话数据使用一个唯一的密钥索引到会话存储中,以获取该客户端的会话数据。
为给定浏览器客户端建立会话的一部分是创建唯一的客户端密钥(通常将其存储在cookie中),该密钥成为全局会话对象的索引。
在传入的HTTP请求上,支持会话的Express中间件会检查特定的客户端cookie,并且如果该特定cookie在http请求上找到并在全局会话对象/数据库中找到,则它将该会话的存储信息添加到请求对象中供http请求处理程序以后使用。
因此,这是一个典型的序列:
- 传入的HTTP请求。
- 中间件检查会话cookie。
- 如果会话cookie不存在,则创建一个,然后在该过程中创建一个唯一的ID,以标识此http客户端。
- 在持久会话存储中,为此新客户端初始化会话。
- 如果存在会话cookie,则在会话存储中查找该客户端的会话数据,并将该数据添加到请求对象。
- 会话中间件处理结束
- 稍后,在此http请求的Express处理中,它到达匹配的请求处理程序。来自会话存储的该特定http客户端的会话数据已经附加到请求对象,并且可供请求处理程序使用。
以上是 express req.session对象如何持久化? 的全部内容, 来源链接: utcz.com/qa/397298.html