Connect-mongo sessions not being deleted automatically

前端 未结 2 1207
一个人的身影
一个人的身影 2021-01-31 21:29

I have an application using NodeJS, Express, MongoDB and connect-mongo.

My issue is that sessions don’t seem to be automatically deleted from MongoDB when they expire, s

相关标签:
2条回答
  • 2021-01-31 22:23

    You haven't set a clear_interval for your sessions .. the connect-mongo default is -1 (or "never"):

    clear_interval Interval in seconds to clear expired sessions (optional, default: -1). Values <= 0 disable expired session clearing.

    Example of removing expired sessions every hour (3600s):

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

    You should also make sure you have set a maxAge on your sessions to they actually expire (eg using 1 day):

    app.use(express.session({
        secret: "myappsecret",
        cookie: { maxAge: 24 * 60 * 60 * 1000 },
        store:sessionStore
    }));
    
    0 讨论(0)
  • 2021-01-31 22:33

    I don't know from where the clear_interval options was taken but I'm looking at the code of the 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()
      }
    }
    

    So the correct way to set auto remove based on that code seems to be:

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

    I dont see any trace of a clear_interval option, so it seems to me the suggested solution would have no effect ...

    0 讨论(0)
提交回复
热议问题