2014-03-02 73 views
0

最有可能的解決方案是微不足道的,但我一直沒有幸運與文檔。 我正在使用express-session中間件和connect-redis會話存儲,因此它將會話保留爲redis。node.js會話在redis刷新時未定義

當我用FLUSHALL刷新redis後,會話信息當然不再可用。當我然後請求我的首頁時,會發送一個「old sid」,其中表示會話在redis中找不到,並且我以未定義的方式結束req.session。這在某種程度上是有道理的 - 因爲沒有會話信息 - 但我不知道如何正確處理。

讓我們更深入地思考;如果用戶在一週後沒有返回,我的下一步就是從商店中刪除舊的會話(以釋放隨機流量的空間)。所以在這個szenario中,當用戶在2周後回來時,我會遇到同樣的問題。

所以我的問題是,它爲什麼不創建一個新的會話,並發現一個新的SID cookie,當它沒有找到sessionstore中的任何東西?或者是一個更好的問題,而不是爲什麼,我該如何做到這一點?

req.session.regenerate()將是顯而易見的方法,但由於req.sessionundefined,沒有可用於任何洞察到這一情況做:(

感謝

/編輯:這是我的會話代碼;

var ExpressRedisStore = require('connect-redis')(express), 
sessionStore = new ExpressRedisStore({ 
    client:redClient 
}), 
app = express(); 
//... <- some middleware 
app.use(express.bodyParser({hash : 'md5'})); 
app.use(cookieParser); 
app.use(express.session({ 
    store: sessionStore, 
    key: "sid", 
    cookie:{ 
     path: '/', 
     httpOnly: true, 
     maxAge: 3600*24*1000 //one day! 
    }, 
    trustProxy:true, 
    rollingSessions:true 
})); 
app.use(userHandler.middleware()); //<-- my own middleware for userManagment 
            // here I fail because req.session is undefined 

回答

1

你的問題幾乎可以肯定是你使用express-session,我無法弄清楚這個軟件包是什麼(它看起來像是一個未經授權的連接分支),但你不想使用它。加connect-redis將做你想做的一切,包括正確地重新生成會話,當你刷新緩存或他們否則過期。

更新時間:

對不起,我錯過了快遞/連接是在一個大的重構的中間。但是,npm上Express的當前發行版本是3.4.8,其中requires連接2.1.2,它不使用快速會話。所以,請嘗試以下操作,讓您的項目工作:

npm uninstall --save express 
npm uninstall --save express-session 
npm install --save express 
npm install --save connect-redis 

這應該給你一個工作安裝,你可以按照這個connect link爲適當的自述文件。

+0

感謝您的回答,但快速會話是從連接回購鏈接(https://github.com/senchalabs/connect),因爲快遞是基於連接,我很確定這是你得到什麼時你做express.session。所以它已經是你提出的。你有另一個想法嗎? - >請參閱上面我的會話設置 – japrescott

+1

請看我更新的答案。 – dankohn

+0

我覺得我有問題,因爲模塊正在更新並在此刻發佈到npm。我明天再來看看。感謝您的更新。我會及時向大家發佈 – japrescott