栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Express cookieSession和Mongoose:如何使request.session.user成为Mongoose模型?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Express cookieSession和Mongoose:如何使request.session.user成为Mongoose模型?

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)});


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370564.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号