即使有了
app.use(express.session({
secret: conf.secret,
maxAge : new Date(Date.now() + 360000),
expires: new Date(Date.now() + 360000),//I've tried both separately
store : new MongoStore(conf.db),
}));
mongodb中的会话永远存在(据我所测试)
即使在会话结束后,MongoDB中的会话存储是否应该留在那里? 因为即使在会话声明中使用maxAge或expires,在MongoDB中,所有会话都是这样的:
{ "_id" : "FU8k3kEzquG/hoSD308H5XHa", "session" : "{\"cookie
\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,
\"path\":\"/\"}}" }
此外,在我的大多数_id中都有某种类型的非数字/字母字符,即/,+等等。它们应该是那样的吗?
每次重新打开浏览器时,都会创建一个新会话,但是旧会话仍在MongoDB中。我只是想知道是否有解决方法,或者这是否是故意的。
谢谢, 布兰登
答案 0 :(得分:4)
即使在会话结束后,MongoDB中的会话存储是否应该保留在那里?
如果浏览器的cookie过期但会话信息已保存在像MongoDB这样的持久后端数据存储中,则这是预期的行为。这两个数据存储(后端与基于浏览器的cookie)可以有不同的到期日。
假设您使用connect-mongodb来保持会话,默认reapInterval
应该每60秒触发一次过期会话的删除。
由于您的会话到期时间设置为“null”,因此这些会话永远不会过期。会话到期应该与cookie expires
值相同..所以如果没有设置它,你可能需要做一些调试来追踪问题。
在您尝试设置maxAge
之前,可能会保存这些旧会话。我会检查新会话是否按照您的预期设置expires
。如果是这样,您可能需要手动删除一些较旧的非过期会话。
此外,在我的大部分_id中都有某种类型的非数字/字母 字符,即/,+等。它们应该是那样的吗?
是的,Express会话ID是24个字符长的字母数字字符串。
答案 1 :(得分:1)
谢谢你的解释,Stennie! 我发现我必须把
cookie: { maxAge: new Date(Date.now() + 360000)}
而不是
maxAge : new Date(Date.now() + 360000)
//or
expires: new Date(Date.now() + 360000)
我将旧的会话集合放在我的数据库中(数据无关紧要,因为我只是测试内容),所以现在我只能在测试时看到新的会话。它们现在看起来应该是这样,并清除每个clear_interval(相当于connect-mongo中的reapInterval)