gpt4 book ai didi

session - 快速 session 存储有些奇怪

转载 作者:搜寻专家 更新时间:2023-10-31 22:36:42 24 4
gpt4 key购买 nike

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

user.name = "Kelvin"; // user is an object pass by "mongoose" findOne's callback.
req.session.user = user;
console.log(req.session.user.name); // Kelvin

然后,我在 express 的其他路由中访问“用户”:

app.get("/somepath", function(req, resp) {
console.log(req.session.user.name); // undefined
});

我想知道为什么req.session.user.name除了我设置的函数之外没有定义?

最佳答案

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

为此,Express 调用 JSON.stringify(sess) 并将字符串存储在内存中。这是 Mongoose 进入的地方。模型以这样一种方式构造,当您将它们字符串化时, 包含在架构中预定义的属性。因此,当您设置 req.session.user = user 时,Express 将 user 字符串化(您丢失了 name 属性)并保存数据。当您在另一条 route 调用 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";(恕我直言,最佳解决方案)

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

关于session - 快速 session 存储有些奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10265521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com