为啥我应该在 MongoDB 中使用 NodeJS 在会话案例中搜索用户?
Posted
技术标签:
【中文标题】为啥我应该在 MongoDB 中使用 NodeJS 在会话案例中搜索用户?【英文标题】:Why should I search in MongoDB for user in session case using NodeJS?为什么我应该在 MongoDB 中使用 NodeJS 在会话案例中搜索用户? 【发布时间】:2021-08-03 02:19:36 【问题描述】:我正在使用 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 不是模式类型对象一样。
您能否解释一下,它是如何以及为什么这样工作的? 在此先感谢:)
【问题讨论】:
【参考方案1】:express-session
包文档提到了这一点:
要存储或访问会话数据,只需使用请求属性 req.session,它(通常)由存储序列化为 JSON。
所以出于存储的目的,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"
【讨论】:
以上是关于为啥我应该在 MongoDB 中使用 NodeJS 在会话案例中搜索用户?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 NodeJs 开发中 Mongodb 比 MySql 更受欢迎? [关闭]
如果这个nodejs rest api没问题并且它的mongoose结构和mongodb数据,为啥我从mongoDB得到空值?