为什么我应该使用 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"
我正在使用 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"