MongoDB会话是否有独立ID?多请求下会话ID不变问题咨询
Mongoose会话ID重复问题解决
问题根源
你错误地使用了session.id.id来获取会话标识,这个属性并不是Mongoose会话的唯一ID。Mongoose会话对象的session.id本身就是一个BSON ObjectId,而session.id.id指向的是ObjectId内部的固定底层值,所以每次获取都会得到相同结果,完全无法区分不同会话。
修正后的代码
const session = await mongoose.startSession(); // 直接提取session.id的hex格式字符串作为唯一键 const sessionId = session.id.toString('hex'); memcache.set(sessionId, { data: sessionId }); // 执行你的业务逻辑 const data = memcache.get(sessionId); // 处理数据 memcache.del(sessionId);
备选独立方案
如果担心Mongoose会话ID仍存在复用风险,可以手动生成UUID作为memcache的键,彻底脱离Mongoose会话ID的依赖:
const { v4: uuidv4 } = require('uuid'); const session = await mongoose.startSession(); // 生成完全独立的全局唯一ID const sessionId = uuidv4(); // 可同时存储Mongoose会话ID用于后续关联 memcache.set(sessionId, { data: sessionId, mongooseSessionId: session.id.toString('hex') }); // 业务逻辑处理 memcache.del(sessionId);
注意事项
- 务必保证每个请求/进程都重新调用
await mongoose.startSession()获取新会话,不要跨请求复用同一个session对象 - 使用UUID方案时,需要先安装依赖包:
npm install uuid
内容的提问来源于stack exchange,提问作者Chicky
相关产品推荐
相关产品推荐

