Express会话存储为单独的存储,并且对可以在那里存储的内容有限制。它不能存储原型数据(方法)。看起来更像是
key<>value存储。
这样做的原因是会话可以存储在任何地方(很多),例如:进程内存;数据库(mongodb); 重做 等等
因此,一旦在会话对象中放入任何内容并完成请求,express就会获取会话数据,将其解析并像纯对象一样粘贴到会话存储中。默认情况下,它是进程内存,但是如前所述-
可以是任何其他存储。
因此,当下一个http请求发生时,会话中间件将尝试使用请求标头中的cookie(如果使用了)数据来恢复会话,并要求会话存储提供数据。因为它已经被格式化-
它不会有.prototype的东西,但只是数据(
object,
array,
string,
number,和其他简单的东西)。
因此,您需要再次根据该数据创建模型。
您可以通过中间件快速完成。因此,
app.configure在定义后,
session
app.use(function(req, res, next) { if (req.session && req.session.user) { req.session.user = new UserModel(req.session.user); } return next();});这将检查是否定义了会话以及用户。然后将根据该数据重新创建猫鼬模型。
如此处的注释中所述-您不应在会话中存储用户数据,因为由于责任与数据所有权的划分会导致不一致。因此,仅存储
ID用户,然后使用中间件从数据库加载它。
app.use(function(req, res, next) { if (req.session && req.session.userID) { UserModel.findById(req.session.userID, function(err, user) { if (!err && user) { req.user = user; next(); } else { next(new Error('Could not restore User from Session.')); } }); } else { next(); }});在您可以创建中间件以检查用户是否登录后:
function userRequired(req, res, next) { if (req.user) { next(); } else { next(new Error('Not Logged In'); }}并像这样使用它:
app.get('/items', userRequired, function(req, res, next) { // will only come here if user is logged in (req.user !== undefined)});


