2012-11-17 239 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 
}) 

餅乾不會被傳遞到服務器除非包含此選項,這意味着請求的會話對象將在每次新呼叫時重置。