为什么我应该使用 NodeJS 在 MongoDB 中搜索会话案例中的用户?

Why should I search in MongoDB for user in session case using NodeJS?

我正在使用 express-session 和 mongoose。 当用户通过身份验证时,我将他的数据放在会话中:

req.session.user = candidate
req.session.isAuthenticated = true
req.session.save()

我创建了中间件来检查 req.session.user 是否存在并将其放入请求中:

if (!req.session.user) {
   return next()
}
req.user = await User.findById(req.session.user._id)
next()

如果我使用而不是 req.user = await User.findById(req.session.user._id) 就这样:req.user = req.session.user 它不允许我访问 userSchema 方法,就好像在那种情况下 req.user 不是模式类型对象。

你能解释一下它是如何以及为什么这样工作的吗? 提前致谢:)

express-session 包文档提到了这一点:

To store or access session data, simply use the request property req.session, which is (generally) serialized as JSON by the store.

因此,出于存储的目的,在 req.session 处引用的对象实际上在保存时被序列化 - 即变成字符串表示形式 - 到会话存储,然后在请求到来时从会话存储中反序列化英寸

作为此序列化过程的一部分,一些信息会丢失 - 包括对象方法,可能更重要的是对象的实际类型。因此,当从序列化版本恢复对象时,您得到的基本上是一个只有非函数属性的通用对象。

请注意,此过程是递归的,因此适用于 req.session 的内容适用于任何嵌套对象。

您可以使用作为标准库一部分的 JSON 序列化器来模拟:

class Session {
    randomMethod() { }
}

var session = new Session()
session.someData = "Some data"

var serialized = JSON.stringify(session)
var restored = JSON.parse(serialized)

console.log(session instanceof Session)     // true
console.log(restored instanceof Session)    // false
console.log("randomMethod" in session)      // true
console.log("randomMethod" in restored)     // false
console.log(session.someData)               // "Some data"
console.log(restored.someData)              // "Some data"