2015-01-04 79 views
0

我有指req.session對象的變量a,然而,當我後來改變了req.session對象,它不是在a改變,爲什麼呢?Node.js的:不能req.session存儲爲參考

var a; 

app.post('/set', function(req, res){ 
    a = req.session; // now a is a reference to req.session 
    res.end(); 
}); 

app.post('/change', function(req, res){ 
    req.session.changed = true; 
    console.log(a); // a has no attribute 'changed', why? 
    res.end(); 
}); 

要執行我第一次做POST /集,然後我做了POST /變化

+0

爲什麼你需要那個? – 2015-01-04 12:04:50

回答

0

當您設置a = req.session;你設置的變量a什麼當前req.session對象包含。因此,當您訪問POST /change時,變量a仍然與您在POST /set中設置req.session時包含的值相同。

爲了去解決這個問題,你必須在POST /change重新設置a = req.session;,像這樣:

app.post('/change', function(req, res){ 
    req.session.changed = true; 
    a = req.session; 
    console.log(a); // a has no attribute 'changed', why? 
    res.end(); 
}); 

我不明白爲什麼你要做到這一點,如使用在a變量生產會破壞你的會話處理,因爲在很多情況下會被別人的會話覆蓋。

1

它不會按照您期望的方式工作,因爲將根據請求重新創建會話對象。的代碼

req.session.changed = true; 

此線增加了一個object-specific property這意味着它將僅該特定req.session對象上設置,所有其它實例req.session不會改變。如果你想要所有req.session的實例具有changed屬性,那麼你需要將原型屬性添加到基礎類型,例如,

SessionType.prototype.changed = true; 

但是,你應該在這裏重新審視自己的做法,因爲如果2所後續POST /set要求的提出則無法機制保障正確的會議即將在POST /change使用。