express.js不在nodeunittesting中保存会话数据

更新底部!

我的node.js服务器使用express.js来pipe理会话。 login后,我将一些用户信息存储在req.session中。 我有一个注销端点,它只是在发送响应之前从req.session删除用户数据。

随着用户的每个请求,我使用authentication中间件来确保会话中仍然存在用户数据,因此删除会话对象中的用户数据将会导致后续authentication失败。

为了testing我的服务器,我有一个nodeunittestinglogin,调用几个端点,注销,然后尝试调用另一个端点。 我希望最后的端点在validation失败,因为我以前吹走了用户数据。 相反,当我最后一次打电话时,我的用户数据仍然存在 。 就好像删除它的注销电话没有被写回到会话存储中一样。

这是我的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'); }; 

unit testing:

 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(); }); } 

当testing运行时,执行通过注销成功,然后进入authenticateSession调用/account ,在这一点上, req.session.user仍然存在! 为什么!?

  • 我的cookie存储是否给我陈旧的数据?
  • 有没有办法强制快速手动保存我的会话数据,或者我只是修改req.session对象,并相信它会保存它?

更新:

看起来这个问题直接与周围的Cookie的应用程序中间件有关。 当我使用app.use(express.session())而不是app.use(express.cookieSession(...)) ,会话数据被正确地吹走,我的testing通过。

我想到了。 显然express.cookieSession(...)是为了设置一次types的存储。 随后的请求将有权访问最初设置的会话数据,但更改req.session对象将不会保存新的会话数据。

为了解决这个问题,我切换到使用express.session(...) ,它使用会话variables的服务器端存储。