【问题标题】:Manually deleting connect-mongo session by _id cast error通过 _id cast 错误手动删除 connect-mongo 会话
【发布时间】:2016-09-29 21:13:09
【问题描述】:

我正在尝试从 connect-mongo 会话集合中手动删除一个文档。当我尝试删除文档时,出现以下错误:

消息:“路径“_id”处值“gl9-V-bjAjqv2Nwdf9vHPLN_Fnnl4Thz”的转换为 ObjectId 失败'

express-session 使用以下函数生成会话 id:

function generateSessionId(sess) {
 return uid(24);
}

从此函数生成的会话进入会话文档的 _id 属性。但是,当您尝试通过生成的 id 查找或删除文档时,您会收到错误消息。

mongodb 文档说 _id 应该是

ObjectId 是一个 12 字节的 BSON 类型 ObjectId

我尝试使用会话上的 genid 选项覆盖会话 ID,但该覆盖并没有将其放入数据库。

如何在文档中获取有效的 _id 或使用无效的 _id 查询文档?

谢谢!

我的基础架构:Express 4.10、Node v0.12.7、Compose.io、connect-mongo、express-session

【问题讨论】:

  • 当你说 "..我试图删除一个文档.." 那么你的意思是什么?您是在会议上打电话给.destroy() 还是在做其他事情?具体来说,您是否为会话存储设置了一个“猫鼬”模型并尝试通过它进行操作?
  • 是的。我有一个猫鼬模型,我正在使用 Model.remove()

标签: node.js mongodb mongoose express-session connect-mongo


【解决方案1】:

好的,你的问题是你用来从会话存储中删除文档的猫鼬模型。您可能应该调用 req.session.destroy() 或设置 TTL 来删除过期的会话。

但基本上,猫鼬希望_id 字段的“类型”是ObjectId,因此是“自动转换”。 mongo-connect 中间件本身不使用猫鼬方法,而是与底层驱动程序方法对话。所以在使用它的内部方法时不会出现这个问题。

因此,您的 mongoose 架构定义应如下所示:

var sessionSchema = new Schema({
    "_id": String,
    "session": String
},{ "_id" false });

或者至少包含 { "_id": false } 以删除默认的自动转换行为。

【讨论】:

  • 谢谢,这解决了我的演员阵容错误。 req.session.destroy() 不会从数据库中删除文档。在我调用 req.session.destroy() 之后,我试图手动从数据库中删除文档以确保会话真正消失。
  • @LarryHipp 我只是快速设置了一个普通安装并使用node-uuid 包在配置中将genid 替换为{ genid: function(req) { return uuid.v4() } }。一切对我来说都很好。如果这对您不起作用,我建议您查看其他配置问题。如果找不到问题,您可以随时发布另一个问题。
猜你喜欢
  • 2012-08-18
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多