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”。