Connect-mongo会话不会自动删除

时间:2012-08-22 21:34:30

标签: node.js session mongodb express connect

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

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

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

2 个答案:

答案 0 :(得分:21)

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

  

clear_interval清除过期会话的秒数(可选,默认值: -1 )。值< = 0禁用过期的会话清除。

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

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
}));

答案 1 :(得分:1)

我不知道从何处使用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选项的痕迹,因此在我看来,建议的解决方案没有效果...