2016-10-05 70 views
1

我是expressjs的新手,我的問題與快速會話有關。快速會話變量在加載api後發生變化

app.js位於package.json下面,我安裝了express和express-session。

如果我去的 'localhost:3000',在控制檯中,req.session.flag值將改變這樣的:


一前:未定義
一前一後:1
兩個前:1
後兩位:2

之後,如果我去的 'localhost:3000 /三',在控制檯中,req.session.flag值將改變這樣的:


三前:2
三後:3

如果我refreash的 'localhost:3000/3' 在這一點上,req.session.flag的值將是2,但不3.


三前:2
三後:3

爲什麼是這樣? req.session.flag的值從前一點改爲3,爲什麼在控制檯中它從2開始?

如果我去'localhost:3000',req.session.flag的值也會從2開始,爲什麼是這種情況?


一前:2
一前一後:1
兩個前:1
後兩位:2個

謝謝!

var express = require('express'); 
 
var session = require("express-session"); 
 
var post = require('./routes/post'); 
 
var app = express(); 
 

 
var port = 3000; 
 

 
app.use(session({secret:'fdsadfasdfdsafdsafdsafdsafd', saveUninitialized:false, resave: false})); 
 

 

 

 
app.get('/', function (req, res, next) { 
 
    console.log("********************************"); 
 
    console.log("One before: "+req.session.flag); 
 
    req.session.flag = 1; 
 
    console.log("One after: "+req.session.flag); 
 
     next(); 
 
}, 
 
function (req, res, next) { 
 
    console.log("Two before: "+req.session.flag); 
 
    req.session.flag = 2; 
 
    console.log("Two after: "+req.session.flag); 
 

 
var html="<!DOCTYPE html><html><head><title>Hello world</title></head><body ><h1>Hello world</h1></body></html>"; 
 
    res.send(html); 
 
}); 
 

 

 
app.get('/three', function (req, res, next) { 
 
    console.log("********************************"); 
 
    console.log("Three before: "+req.session.flag); 
 
req.session.flag = 3; 
 
console.log("Three after: "+req.session.flag); 
 
}); 
 

 

 
app.listen(port);

回答

0

會話不會被保存在您的/three端點。這是因爲你不發回任何迴應(甚至沒有迴應)。

express-session文檔:

Session.save()

保存會話回到店裏,在 存儲與內存中的內容替換的內容(儘管商店可以做東西 其他 - 請查看商店的文檔以瞭解確切的行爲)。

此方法是在如果 會話數據已被改變(儘管這種行爲可以在中間件構造各種選項被改變 )的HTTP響應結束自動調用。因此, 通常不需要調用此方法。

在某些情況下,調用此方法很有用,例如對於長期請求或WebSockets中的 示例。

既然你不叫res.send(或簡稱res.end),請求最終會超時,會話將不會被保存。

由於JavaScript與回調的異步性質,express不能只發送默認響應。您必須始終手動發送一個。

+0

感謝您的詳細解釋,非常appriciated – yin