更新!express.js不保存會話數據上nodeunit測試
我的node.js服務器使用express.js管理會話。登錄後,我將一些用戶信息存儲在req.session中。我有一個註銷端點,它只是在發送響應之前從req.session刪除用戶數據。
隨着每一個用戶發出請求時,我使用驗證的中間件,以確保仍有用戶數據在會話中,所以刪除用戶數據在會話對象應該失敗任何後續認證。
爲了測試我的服務器,我有一個nodeunit測試記錄中,調用了幾個端點,註銷,然後再嘗試調用另一個端點。 我期望最後的端點在身份驗證中失敗,因爲我之前將用戶數據吹走。相反,當我進行最後一次通話時,我的用戶數據仍然存在。就好像刪除它的註銷電話沒有寫回會話存儲區一樣。
這裏是我的app.js:
app.use(express.cookieParser('secretPassword'));
app.use(express.cookieSession({key: 'someKey'}));
...
app.get('/logout', accounts.logout);
app.get('/account', auth.authenticateSession, accounts.show);
auth.js:
exports.authenticateSession = function(req, res, next) {
if (!req.session.user) {
return res.json(401, {
error: 'Access denied. You must be logged in to make this request.'
});
}
...
}
accounts.js:註銷:
exports.logout = function(req, res) {
req.session.user = null;
res.send('Logged out');
};
單元測試:
step1_logIn : function(test) {
var postData = qs.stringify({
accountname: 'testAcct',
accountpassword: 'hello'
});
ct.postAndCall('/login', null, postData, function(resData, res) {
myCookie = res.headers['set-cookie'];
test.ok(res.statusCode === 200);
test.done();
});
},
step2_logout : function(test) {
ct.getAndCall('/logout', myCookie, function(data, res) {
test.ok(data === 'Logged out.');
test.ok(res.statusCode === 200);
test.done();
});
},
step3_ensureLoggedOut: function(test) {
ct.getAndCall('/account', myCookie, function(data, res) {
test.ok(res.statusCode === 401);
test.done();
});
}
當測試運行,執行經過註銷成功,然後進入authenticateSession
在調用/account
在這一點上,req.session.user
依然存在!爲什麼!?
- 我的cookie商店是否給我陳舊的數據?
- 有沒有辦法強制express手動保存會話數據,還是隻修改req.session對象並相信它會保存它?
更新:
它看起來像這個問題直接關係到周圍餅乾應用中間件。當我使用app.use(express.session())
而不是app.use(express.cookieSession(...))
時,會話數據被正確地吹走並且我的測試通過。