2012-08-16 81 views
4

即使爲什麼在會話結束後,mongodb會話MongoStore不再使用?

app.use(express.session({ 
    secret: conf.secret, 
    maxAge : new Date(Date.now() + 360000), 
    expires: new Date(Date.now() + 360000),//I've tried both separately 
    store : new MongoStore(conf.db), 


})); 

MongoDB中的會議永遠留(據我已經測試)

是MongoDB中的會話存儲,甚至應該在會話結束後只是呆在那裏?
因爲即使有MAXAGE或在會議聲明中到期,在MongoDB中,所有的對話是這樣的:

{ "_id" : "FU8k3kEzquG/hoSD308H5XHa", "session" : "{\"cookie 
\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true, 
\"path\":\"/\"}}" } 

而且,我的大部分_id的有一些類型的非數字/字母字符,即/,+等。他們應該是這樣嗎?

每次我重新打開我的瀏覽器時,都會創建一個新的會話,但舊的會話仍然存在於MongoDB中。我只想知道這是否有解決辦法,或者這是故意的。

感謝, 布蘭登

回答

4

在MongoDB的會議商店甚至應該在會話結束後只是呆在那裏?

這是預期的行爲,如果你的瀏覽器的cookie到期,但會話信息已經保存在像MongoDB中持久後端數據存儲。這兩個數據存儲(後端與基於瀏覽器的cookie)可以有不同的到期日期。

假設您使用connect-mongodb來持續會話,則默認reapInterval應該每60秒觸發移除已到期的會話。

由於您的會話到期時間設置爲「空」,因此這些會話永遠不會過期。會話到期應該與cookie的值expires相同。所以如果沒有設置,您可能需要進行一些調試來追蹤問題。

在嘗試設置maxAge之前可能會保存這些舊會話;我會檢查是否新的會議設置爲expires如你所料。如果是這樣,您可能需要手動刪除一些較早的非到期會話。

此外,在我的大部分_id中都有一些非數字/字母 字符,即/,+等。他們應該是這樣嗎?

是的,Express sessionIDs是長度爲24個字符的字母數字字符串。

1

感謝您的解釋,Stennie! 我發現我不得不把

cookie: { maxAge: new Date(Date.now() + 360000)} 

代替

maxAge : new Date(Date.now() + 360000) 
//or 
expires: new Date(Date.now() + 360000) 

我在數據庫中刪除我的舊會話集合(數據並不重要,因爲我只是測試的東西)的,所以現在我只能在測試時看到新的會話。他們現在看起來應該是,並清除每個clear_interval(相當於connect-mongo中的reapInterval)