2011-09-26 95 views
3

我有一個關於快速會話存儲內存的問題,並設置了reapInterval值。我有一個示例代碼,它將每5秒輸出一次存儲器的值。如果我現在設置5000的重獲間隔,它應該每隔5秒清理一次過期的會話?所以,我的例子是這樣的:快速會話存儲和reapInterval

/** 
* 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,但在MemoryStore的舊的會話仍然存在......它應該不是每5秒檢查一次並刪除?

Thx爲您的幫助!

+0

爲什麼即使有這樣的煩惱呢?在生產中,你會使用connect-redis或connect-mongo來存儲會話。 :) – alessioalex

+0

解決這個問題有什麼好運氣?我遇到了同樣的問題。 – mihai

回答

1

所以第一個問題是這裏的一個誤解。 reapInterval不會執行任何操作。 MemoryStore根據會話cookie的過期時間清除cookie。所以Connects MemoryStore中存在一個錯誤。我看到它的破碎流程就像這樣。

  • 設置cookie的X中
  • 到期獲取會話數據,有X過去了?不,好吧。
  • (cookie過期)
  • 獲取會話數據,會話不存在,生成新會話數據。
  • X已經過去了,但會話ID缺失,因爲瀏覽器已經過期。

這裏有一個關於此的討論。

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

而且多汁的報價

「短的Cookie會話將被擰我猜」 --visionmedia

+0

你也可以查看'''MemoryStore.prototype.get'''來看看它是如何工作的。 –