【问题标题】:connect-mongo autoRemoveInterval does not work correctlyconnect-mongo autoRemoveInterval 无法正常工作
【发布时间】:2021-01-01 02:09:07
【问题描述】:

我的代码:(带有express.jsexpress-session

app.use(session({
  store: new MongoStore({
    mongooseConnection: db,
    autoRemove: 'interval',
    autoRemoveInterval: 1 // 1 minute (min)
  }),
  secret: 'someSecret',
  name: 'secret',
  genid: ()=>{
     return uuid4();
  },
  resave: false,
  saveUninitialized: false,
  cookie: {
    httpOnly: true,
    sameSite: true,
    maxAge: 60*1000 // 1 minute (ms)
  }
}));

我已经配置了connect-mongo,以便它每分钟清理一次过期的会话。 cookie 的maxAge 值也是一分钟。但由于某种原因,connect-mongo 不是在一分钟后清除会话,而是在一分 20 秒后清除会话。 connect-mongo 在一分钟内准确清理它对我来说很重要,但我不明白他为什么这么晚才清理它。对不起我的英语不好。非常感谢您的帮助。

【问题讨论】:

    标签: mongodb express session


    【解决方案1】:

    根据 connect-mongo documentation,它使用 MongoDB TTL 索引来使会话过期。

    以下来自MongoDB documentation

    TTL 索引不保证过期数据会在过期后立即被删除。文档过期与 MongoDB 从数据库中删除文档的时间之间可能存在延迟。

    删除过期文档的后台任务每 60 秒运行一次。因此,在文档到期和后台任务运行期间,文档可能会保留在集合中。

    由于删除操作的持续时间取决于您的 mongod 实例的工作负载,因此在后台任务运行之间的 60 秒时间段之后,过期数据可能会存在一段时间。

    使用内置的过期方法只能精确到一两分钟。如果您在该操作中需要更高的精度,则需要在您的应用程序中实现该行为。

    【讨论】:

    • 感谢您的回答!我注意到,当会话更改时,使用req.session.param = "some value",数据库中的expires 值会不断更新,这会产生某种影响吗?我不知道如何禁用过期更新。
    • 是的,我刚刚检查过,当我更改会话时,例如:req.session.param = "somevalue";,数据库中的expires 值被扩展,它会影响删除速度。如果会话值不变,expires 不会被扩展,删除速度很快。该怎么办?会话更改时,我不需要扩展 expires
    猜你喜欢
    • 2019-11-04
    • 2020-03-16
    • 1970-01-01
    • 2016-12-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多