为什么mongodb会话MongoStore会在会话结束后消失?

时间:2012-08-16 00:34:01

标签: node.js session mongodb express

即使有了

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中。我只是想知道是否有解决方法,或者这是否是故意的。

谢谢, 布兰登

2 个答案:

答案 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)