Session express会话存储有点奇怪
如果我在会话中存储对象,如下所示:Session express会话存储有点奇怪,session,node.js,express,mongoose,Session,Node.js,Express,Mongoose,如果我在会话中存储对象,如下所示: user.name = "Kelvin"; // user is an object pass by "mongoose" findOne's callback. req.session.user = user; console.log(req.session.user.name); // Kelvin 在那之后,我在其他快车路线上访问“用户”: app.get("/somepath", function(req, resp) { console.
user.name = "Kelvin"; // user is an object pass by "mongoose" findOne's callback.
req.session.user = user;
console.log(req.session.user.name); // Kelvin
在那之后,我在其他快车路线上访问“用户”:
app.get("/somepath", function(req, resp) {
console.log(req.session.user.name); // undefined
});
我想知道为什么req.session.user.name除了我设置的函数之外没有定义?在查看mongoose源代码后,我可以说这是因为mongoose模型和会话是如何工作的。当您调用
req.session.user=user
时,然后req.session.user
指向对象,但实际上数据需要存储在某个地方(如内存或Redis)
为了做到这一点,Express调用JSON.stringify(sess)
,字符串存储在内存中。这里是猫鼬进入的地方。模型是以这样的方式构建的,当您对它们进行字符串化时,只包含模式中预定义的属性。因此,当您设置req.session.user=user
Express字符串化user
(您松开name
属性)并保存数据时。当您在另一个route Express中调用req.session.user
时,将解析字符串化的数据,并获得不带name
属性的对象
现在如何解决这个问题?有几种方法
- 向模式添加
属性李>name
- 为用户定义新的文字对象:
var newuser={id:user.id,名称:“Kelvin”,pwd:user.pwd,等等}代码>
req.session.user=newuser代码>
- 在另一个字段中存储名称:
req.session.name=“Kelvin”代码>(imho的最佳解决方案)
顺便说一下:您不应该在会话中保留用户对象。如果其他用户(如管理员)更改了用户对象,该怎么办?你根本看不到他们。我建议只保留会话中用户的id,并制作自定义中间件从DB加载用户,并将其存储在
请求对象中。很有趣。调用console.log(req.session.user)
时会得到什么?在函数中,我设置了属性“name”,console.log(req.session.user)
包含来自mongoose和我设置的“name”的其他属性,但在其他路由函数中,只有来自mongoose的属性,没有“name”。