【问题标题】:Something weird about express session store快速会话存储有些奇怪
【发布时间】:2012-05-03 04:16:05
【问题描述】:

如果我像这样在会话中存储一个对象:

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除了我设置的函数外没有定义?

【问题讨论】:

  • 有趣。拨打console.log(req.session.user)会得到什么??
  • 在我设置属性“name”的函数中,console.log(req.session.user) 包含我设置的 mongoose 和“name”的其他属性,但只有 mongoose 的属性,在其他路由函数中没有“name”。

标签: session node.js express mongoose


【解决方案1】:

查看 mongoose 源代码后,我可以说这是因为 mongoose 模型和会话的工作方式。当您调用 req.session.user = user 时,req.session.user 指向对象,但实际上数据需要存储在某处(如内存或 Redis)。

为此,Express 调用JSON.stringify(sess) 并将字符串存储在内存中。这是猫鼬进入的地方。模型的构造方式是,当您对它们进行字符串化时,包含在 Schema 中预定义的属性。因此,当您设置 req.session.user = user 时,Express 会将 user 字符串化(您会丢失 name 属性)并保存数据。当您在另一条路由中调用 req.session.user 时,Express 会解析字符串化数据,并且您会获得没有 name 属性的对象。

现在如何解决这个问题?有几种方法。

  • name 属性添加到Schema;
  • 为用户定义新的文字对象:

    var newuser = { id: user.id, name : "Kelvin", pwd: user.pwd, etc. }; req.session.user = newuser;

  • 商店名称在另一个字段中:req.session.name = "Kelvin";(恕我直言的最佳解决方案)

顺便说一句:您不应该在会话中持有用户对象。如果像管理员这样的其他用户对用户对象进行了更改怎么办?你根本看不到他们。我建议在会话中只保留用户的 id,并制作自定义中间件以从数据库加载用户并将其存储在 request 对象中。

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 2021-06-01
    • 1970-01-01
    • 2022-01-26
    • 2016-10-21
    • 2015-07-05
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多