2012-04-22 18 views
4

如果我保存這樣的會話對象:一些奇怪的關於快遞會話存儲

app.get("/somepath", function(req, resp) { 
    console.log(req.session.user.name); // undefined 
}); 

我想:

user.name = "Kelvin"; // user is an object pass by "mongoose" findOne's callback. 
req.session.user = user; 
console.log(req.session.user.name); // Kelvin 

,並在那之後,我在快遞的其他途徑訪問「用戶」要知道爲什麼req.session.user.name除了我設置的函數還未定義?

+0

有趣。當你調用'console.log(req.session.user)'時,你會得到什麼? – freakish 2012-04-22 08:10:15

+0

在我設置屬性「name」的函數中,'console.log(req.session.user)'包含我設置的mongoose和「name」中的其他屬性,但是在其他路由函數中只有屬性形式mongoose而沒有「name」 。 – Kevin 2012-04-22 08:30:37

回答

15

尋找到貓鼬的源代碼後,我可以說,這是因爲模型和會話是如何工作的貓鼬。當您撥打req.session.user = user時,req.session.user指向該對象,但實際上數據需要存儲在某處(如內存或Redis)。

爲了做到這一點快速調用JSON.stringify(sess)和字符串存儲在內存中。這裏是貓鼬進入的地方。模型以這種方式構建,當您將它們串聯起來時,只包括中預定義的屬性。所以當你設置req.session.user = user快遞字符串user(你鬆散name屬性)並保存數據。當您在另一個路由中調用req.session.user時,Express將解析字符串化的數據,並獲得沒有name屬性的對象。

現在該如何解決?有幾種方法。

  • name屬性添加到Schema;
  • 定義用戶的新文本對象:

    var newuser = { id: user.id, name : "Kelvin", pwd: user.pwd, etc. }; req.session.user = newuser;

  • 店鋪名稱在另一個領域:req.session.name = "Kelvin";(最好的解決方案恕我直言)

順便說一句:你不應該」 t保持會話中的用戶對象。如果像管理員這樣的其他用戶對用戶對象進行更改怎麼辦?你根本看不到它們。我建議只保存會話中用戶的id,並使定製中間件從DB加載用戶並將其存儲在request對象中。

+0

真的很好迴應 – Petrov 2012-07-17 21:28:01