0

给定一个 sessionId,我需要获取快速会话对象。之后,我希望能够编辑这个会话对象,并让它自动更新会话存储中的会话。

Session = require('express').session.Session;

_testSession: (sStore, sId) ->
  console.log 'called _testSession with session id: ' + sId

  sStore.get sId, (error, session) ->
    expressSession = new Session 
        sessionId: sId
        sessionStore: sStore
        , session
    expressSession.foo = 17

    console.log 'set expressSession.foo to: ' + expressSession.foo

    setTimeout (()->
        sStore.get sId, (error, session) ->
            console.log 'foo = ' + session.foo
        ), 1000

但是,在运行此测试时,我得到以下输出:

called _testSession with session id: YaFLcq3eSvoNuwnLS1T1ntrC.3UJMuQ5So6lYRWLDgIRx4Vk/Ab1qH65zV9IwMqoMcR8
set expressSession.foo to: 17
foo = undefined

有谁知道这里发生了什么?... :(

==== 编辑 ====

我也尝试调用 save() ,以便代码读取:

console.log 'set expressSession.foo to: ' + expressSession.foo

expressSession.save (error) ->
    console.log 'error: ' + error
    setTimeout (()->
        sStore.get sId, (error, session) ->
            console.log 'foo = ' + session.foo
        ), 1000

并得到相同的输出:(

==== 编辑 ====

没关系, save() 有效。sessionId 应该是 sessionID... /facepalm.

4

1 回答 1

1

正如@robertj 所说,除非您告诉它保存,否则您可能不会看到保存的对象。

但更重要的是,除非您特别打算测试会话对象本身(即连接的会话中间件),否则您正在做的事情毫无意义。

没有更多上下文很难说,但我希望您在这里的目的是确保某些路由处理程序或中间件将某些东西放入会话中,是吗?如果是这样,请单独测试它。例如

var should = require('should');

var req = { session : {}, /*any other bits of req you expect your handler to need */};
var res = { /* whatever functions your handler needs off the response */ };

yourHandler(req, res);
req.session.foo.should.be.ok; // not null; alternatively test equality or whatever

那是为了“单元测试”。如果你正在做一个集成测试(你想看到事情一起工作,例如 db 和 view 等),那么你仍然不需要检查会话,你应该检查它的效果

于 2012-09-06T16:26:25.043 回答