13

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

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

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

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

  • 节点: 0.7.0-pre
  • 连接蒙戈: 0.1.7
  • 快递: 2.5.2
  • 连接: 1.8.5
4

2 回答 2

25

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

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

每小时(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
}));
于 2012-08-23T04:08:54.140 回答
5

我不知道从哪里获取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()
  }
}

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

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

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

于 2018-09-27T05:22:18.180 回答