Connect-mongo会话不会自动删除

Kev*_*ard 10 session connect mongodb node.js express

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

我的问题是,当MongoDB过期时,会话似乎没有自动删除,因此db大小会增加,直到磁盘已满.

connect-mongo的开发者写了一条评论:

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'));
});
Run Code Online (Sandbox Code Playgroud)

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

  • 节点: 0.7.0-pre
  • connect-mongo: 0.1.7
  • 表达: 2.5.2
  • 连接: 1.8.5

Ste*_*nie 21

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

clear_interval清除过期会话的时间间隔(以秒为单位)(可选,默认值:-1).值<= 0禁用过期的会话清除.

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

var sessionStore = new MongoStore({
     db: 'myappsession',
     clear_interval: 3600
});
Run Code Online (Sandbox Code Playgroud)

您还应确保已将maxAge会话设置为实际到期(例如,使用1天):

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

  • `connect-mongo` 的新默认值是 2 周,而不是“从不”。并且设置位于`ttl` https://www.npmjs.com/package/connect-mongo (2认同)

Phi*_*ppe 6

我不知道这些选项是从哪里获取的,但我正在查看最新版本clear_interval的代码:

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()
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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