Сессии Connect-Mongo не удаляются автоматически

У меня есть приложение, использующее 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
  • Connect-Mongo: 0,1,7
  • экспресс: 2.5.2
  • подключить: 1.8.5

2 ответа

Решение

Вы не установили clear_interval для ваших сеансов.. по умолчанию 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
}));

Я не знаю откуда 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 вариант, так что мне кажется, предлагаемое решение не будет иметь никакого эффекта...

Другие вопросы по тегам