2012-11-17 191 views
5

我试图在节点中设置基本会话系统。下面是我到目前为止有:快速会话不会持续

app.js:

app.use(express.cookieParser('stackoverflow')); 
app.use(express.session()); 

我设置在ajax.js会话数据:

addClassToCart: function(req, res) { 
    req.session.cart = req.body.classId; 
    console.log(req.session.cart); 
} 

这记录正确的信息。然而,当我尝试到别处检索该信息(同一个文件,不同的功能):

console.log(req.session.cart); 

我得到undefined。我觉得我错过了一些非常基本的东西。各种各样的教程是可怕的,或者需要我添加更多的包(我试图避免的东西)。从我的调试

更多的数据:

  • 这适用于非Ajax请求
  • 它登陆前的会话设置。

回答

5

事实证明,这个问题不是Express会话(因为其他答案似乎认为)。相反,这是我的一个误解。我改变addClassToCart以下内容:

addClassToCart: function(req, res) { 
    req.session.cart = req.body.classId; 
    console.log(req.session.cart); 
    res.send('class added'); 
    } 

添加res.send()解决了这一问题。

+0

我有类似的问题。发送响应触发器是否持续会话?因为那正是我不能做的:) – bitstream

+0

是的,发送响应触发了会话更新。 – SomeKittens

+1

嘿!我通过执行req.session.save()手动触发更新来解决了我的问题。你不需要发送回复。 – bitstream

-1

我不知道基本的会话存储,但Redis的只花了我几分钟的时间设置:

app.use(express.session({ 
    store: new RedisStore({ 
     host: cfg.redis.host, 
     db: cfg.redis.db 
    }), 
    secret: 'poopy pants' 
    })); 

在Mac上:

brew install redis 
+1

>或要求我添加更多的包(我试图避免的东西)。 – SomeKittens

-1
app.use(express.session({ 
    secret: "my secret", 
    store: new RedisStore, 
    cookie: { secure: false, maxAge:86400000 } 
})); 

不知道问题出现在会话年龄段,但为了安全起见,我建议你指定maxAge。

+0

这需要我添加'Redis'。我在问题中明确表示我不想安装新软件包。 – SomeKittens

2

正如the answer to a related SO question指出,这也可能发生,如果你正在使用fetch摆脱你的服务器数据,但你不要在credentials选项传递:

fetch('/addclasstocart', { 
    method: 'POST', 
    credentials: 'same-origin' // <- this is mandatory to deal with cookies 
}) 

饼干不会被传递到服务器除非包含此选项,这意味着请求的会话对象将在每次新呼叫时重置。