Express会话存储和reapInterval

时间:2011-09-26 01:08:47

标签: session node.js express

我有关于快速会话存储内存的问题,并设置了reapInterval值。我有一个示例代码,它将每5秒输出一次memorystore的值。如果我现在设置一个5000的reapinterval,它应该每5秒清理一次过期的会话吗?所以我的例子如下:

/**
 * Module dependencies.
 */

var express = require('express');
var app = module.exports = express.createServer();
var MemStore = require('express/node_modules/connect/lib/middleware/session/memory');
var store = new MemStore({reapInterval: 5000});

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({secret: 'your secret here', store: store, cookie: {maxAge: 30000}}));
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

setInterval(function(){
    console.log(new Date());
    console.log(store);
}, 5000);

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
  app.use(express.errorHandler()); 
});

// Routes

app.get('/', function(req, res){
  res.render('index', {
     title: 'Express'
  });
});

app.listen(3000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

现在的问题是,如果我在30秒后重新访问该页面,我会得到一个新的SID,但内存中的旧会话仍然存在...是否应该每5秒检查一次并删除?

谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

所以第一个问题是这里的误解。 reapInterval什么都不做。 MemoryStore根据会话cookie的到期时间清除cookie。所以在Connects MemoryStore中实际上存在一个错误。我认为它破碎的流程是这样的。

  • 将Cookie设置为在X中过期。
  • 获取会话数据,X已经过去了吗?不,好的。
  • (cookie过期)
  • 获取会话数据,会话不存在,生成新会话。
  • X已经过去但会话ID丢失,因为浏览器已经过期了。

这里有一个关于此的讨论。

https://github.com/senchalabs/connect/issues/328

多汁的报价

“简短的cookie会话会被搞砸我猜”--visionmedia