2013-10-04 18 views
1

更新!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(...))時,會話數據被正確地吹走並且我的測試通過。

回答

1

我想通了。顯然express.cookieSession(...)是一種一次性存儲類型。隨後的請求將有權訪問最初設置的會話數據,但更改req.session對象不會保存新會話數據。

要解決這個問題,我切換到使用express.session(...)其使用會話瓦爾服務器端存儲。