5

即使

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

谢谢,布兰登

4

2 回答 2

5

即使在会话结束后,MongoDB 中的会话存储是否应该保留在那里?

如果您的浏览器的 cookie 过期但会话信息已保存在 MongoDB 等持久性后端数据存储中,这是预期的行为。两个数据存储(后端与基于浏览器的 cookie)可以有不同的到期时间。

假设你使用connect-mongodb来持久化会话,默认reapInterval应该每 60 秒触发一次过期会话的删除。

由于您的会话到期设置为“null”,因此这些会话永远不会过期。会话到期与 cookieexpires值相同.. 因此,如果未设置,您可能需要进行一些调试以跟踪问题。

这些可能是在您尝试设置之前保存的旧会话maxAge;我会检查新会话是否expires按照您的预期设置。如果是这样,您可能需要手动删除一些较旧的未到期会话。

此外,在我的大多数_id 中都有某种类型的非数字/字母字符,即/、+ 等。它们应该是这样的吗?

是的,Express sessionID 是 24 个字符长的字母数字字符串。

于 2012-08-16T05:10:08.713 回答
1

谢谢你的解释,斯坦尼!我发现我必须把

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 )

于 2012-08-16T21:15:48.923 回答