为啥我应该在 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为啥要用mongoose操作mongodb

为啥在 NodeJs 开发中 Mongodb 比 MySql 更受欢迎? [关闭]

关于NodeJs为啥要用mongoose操作mongodb

关于NodeJs为啥要用mongoose操作mongodb

如果这个nodejs rest api没问题并且它的mongoose结构和mongodb数据,为啥我从mongoDB得到空值?

使用nodejs在整个集合(mongodb)中搜索