我尝试从connect-mongo会话集合中手动删除文档。当我尝试删除文档时,出现以下错误:
消息:'强制转换为ObjectId的值" gl9-V-bjAjqv2Nwdf9vHPLN_Fnnl4Thz"在路径" _id"'
express-session使用以下函数生成会话ID:
function generateSessionId(sess) {
return uid(24);
}
从此函数生成的会话正在进入会话文档的_id属性。但是,当您尝试通过生成的ID查找或删除文档时,您会收到错误。
mongodb docs说_id应该是
ObjectId是一个12字节的BSON类型 ObjectId
我尝试使用会话上的genid选项覆盖会话ID,但覆盖不会进入数据库。
如何在文档中获取有效的_id或使用无效的_id查询文档?
谢谢!
我的基础设施:Express 4.10,Node v0.12.7,Compose.io,connect-mongo,express-session
答案 0 :(得分:2)
好的,这里你的问题是用于从会话存储中删除文档的mongoose模型。您可能应该调用req.session.destroy()
或设置TTL来删除过期的会话。
但基本上,mongoose期望_id
字段的“类型”为ObjectId
,因此“autocasts”。 mongo-connect
中间件本身不使用mongoose方法,而是与底层驱动程序方法进行对话。所以当使用它的内部方法时它没有这个问题。
因此,您的mongoose模式定义应如下所示:
var sessionSchema = new Schema({
"_id": String,
"session": String
},{ "_id" false });
或者至少包含{ "_id": false }
以删除默认的自动投放行为。