【问题标题】:Connect-mongo sessions not being deleted automaticallyConnect-mongo 会话不会被自动删除
【发布时间】:2012-08-18 09:14:47
【问题描述】:

我有一个使用 NodeJS、Express、MongoDB 和 connect-mongo 的应用程序。

我的问题是会话过期时似乎不会自动从 MongoDB 中删除,因此 db 大小会增长直到磁盘已满。

connect-mongo 的开发者wrote a comment

connect-mongo 将要求 MongoDB 删除所有具有 在当前日期之前过期。

但这似乎并没有发生在我的案例中。

我的配置是:

var express = require('express');
var MongoStore = require('connect-mongo');

var sessionStore = new MongoStore({db: 'myappsession'});

var app = express.createServer();

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'ejs');
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(express.session({ secret: "myappsecret", store:sessionStore }));
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
});

我目前正在运行以下版本:

  • 节点: 0.7.0-pre
  • connect-mongo: 0.1.7
  • 快递: 2.5.2
  • 连接: 1.8.5

【问题讨论】:

    标签: node.js session mongodb express connect


    【解决方案1】:

    您还没有为会话设置clear_interval .. connect-mongo 默认值为 -1(或“从不”):

    clear_interval 清除过期会话的时间间隔(可选,默认值:-1)。值

    每小时(3600 秒)删除过期会话的示例:

    var sessionStore = new MongoStore({
         db: 'myappsession',
         clear_interval: 3600
    });
    

    您还应该确保已在会话中设置了maxAge,以便它们实际到期(例如使用 1 天):

    app.use(express.session({
        secret: "myappsecret",
        cookie: { maxAge: 24 * 60 * 60 * 1000 },
        store:sessionStore
    }));
    

    【讨论】:

    • 感谢 Stennie,这是一个很大的帮助。关于 maxAge 设置,应该以秒还是毫秒为单位指定?比如 new Date(Date.now() + 86400) 还是 new Date(Date.now() + 86400 * 1000)?
    • @KevanStannard:对不起,搞砸了 maxAge .. 更正了上面的例子。你是对的,它应该是毫秒。一想到到期日,我就走神了。
    • connect-mongo 的新默认值为 2 周,而不是“从不”。该设置位于ttl npmjs.com/package/connect-mongo
    【解决方案2】:

    我不知道clear_interval 选项的来源,但我正在查看latest version 的代码:

    class MongoStore extends Store {
     constructor(options) {
      options = options || {}
    
      /* Fallback */
      if (options.fallbackMemory && MemoryStore) {
        return new MemoryStore()
      }
    
      super(options)
    
      /* Options */
      this.ttl = options.ttl || 1209600 // 14 days
      this.collectionName = options.collection || 'sessions'
      this.autoRemove = options.autoRemove || 'native'
      this.autoRemoveInterval = options.autoRemoveInterval || 10
      this.transformFunctions = computeTransformFunctions(options, true)
    
      // ...
    
    setAutoRemoveAsync() {
      const removeQuery = {expires: {$lt: new Date()}}
      switch (this.autoRemove) {
        case 'native':
          return this.collection.createIndex({expires: 1}, {expireAfterSeconds: 0})
        case 'interval':
          this.timer = setInterval(() => this.collection.remove(removeQuery, {w: 0}), this.autoRemoveInterval * 1000 * 60)
          this.timer.unref()
          return Promise.resolve()
        default:
          return Promise.resolve()
      }
    }
    

    所以根据该代码设置自动删除的正确方法似乎是:

    const store = new MongoStore({
      url: "put db connection string here ...",
      autoRemove: 'interval',     
      autoRemoveInterval: 60 * 24 // In minutes. Default
    })
    

    我没有看到任何 clear_interval 选项的痕迹,所以在我看来,建议的解决方案没有任何效果......

    【讨论】:

    • 我最初的答案是 2012 年的当前 connect-mongo 版本。从那以后情况肯定发生了变化,但当时的答案是有效的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多