通过 _id 转换错误手动删除 connect-mongo 会话

Manually deleting connect-mongo session by _id cast error

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

message: 'Cast to ObjectId failed for value "gl9-V-bjAjqv2Nwdf9vHPLN_Fnnl4Thz" at path "_id"'

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

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

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

mongodb 文档说 _id 应该是

ObjectId is a 12-byte BSON type ObjectId

我尝试在会话中使用 genid 选项覆盖会话 ID,但覆盖没有进入数据库。

如何将有效的 _id 添加到文档或使用无效的 _id 查询文档?

谢谢!

我的基础设施:Express 4.10,Node v0.12.7,Compose.io,connect-mongo,express-session

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

但基本上,mongoose 期望 _id 字段的 "type" 是 ObjectId,因此 "autocasts"。 mongo-connect 中间件本身不使用 mongoose 方法,而是与底层驱动程序方法通信。所以使用它的内部方法不会有这个问题。

因此,您的 mongoose 模式定义应该如下所示:

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

或者至少包含 { "_id": false } 以移除默认的自动施放行为。