我看到了一些非常奇怪的節點會話。我使用express-session和connect-mongo保存會話。節點會話沒有正確保存
我的會話設置如下(所有的請求都通過HTTPS):
var session = require('express-session');
var MongoStore = require('connect-mongo/es5')(session);
var sess = {};
app.use(session({
secret: 'xxxx',
saveUninitialized: false,
store: new MongoStore({
mongooseConnection: mongoose.connection,
ttl: 60 * 30 // haf hour
}),
cookie: { secure: true }
}));
我有一個創建與節點的畫布圖像的路線:
app.get('/api/canvas', function(req, res) {
sess = req.session;
console.log('in canvas and sess is ', sess);
// create image stuff
});
在亞洲其他應用程序,你可以設置像背景顏色的東西。然後,我清楚這些路線:
app.get('/api/clear', function(req, res) {
sess = req.session;
if (sess.colors) {
delete sess.colors;
}
sess.save(function(err) {
console.log('saved sess is now ', sess);
// session saved
helper.sendJsonResponse(req, res, 200, {});
})
});
helper.sendJsonResponse()
只是一個 HTTP代碼和一個空的身體反應。
你可以看到我使用session.save()
的回調函數,因爲當我知道會話已被編輯和保存時,我只想回應請求。
但是,這並不總是奏效。如果我在會話中設置了顏色,然後清除它們(通過調用'api/clear'路徑),然後調用路由來創建圖像(通過調用'api/canvas'路徑),'api/canvas上的會話'路線會議有時仍然有顏色設置。
只有我快速做到這一點,情況似乎就是這樣。如果等待幾秒鐘,顏色將被清除以用於'api/canvas'路線。
注意:我不允許同時調用這些路由 - 我使用承諾並在用戶界面中有一個微調器,覆蓋整個屏幕直到請求完全完成。
當這種情況發生時,日誌是這樣的:
saved sess is now { cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
canvasHeight: 500,
canvasWidth: 591
}
當我做出請求「API /帆布」:
in canvas and sess is { cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
canvasHeight: 500,
canvasWidth: 591,
colors:
{
color1: 'red',
color2: 'green'
}
}
所以你可以看到,顏色屬性仍設置。大約有50%的時間發生這種情況。剩下的時間,在第二個請求中,顏色屬性已被刪除。
什麼可能會出錯?我誤解了會議的工作方式嗎?
編輯
這得到不斷越古怪。如果我將這些調用鏈接到用戶界面中,那麼稱爲'api/clear'路線,然後在Promise then()方法中調用'api/canvas'路線,它總是起作用。如果我打電話單獨提出請求,結果是完全隨機的 - 有時會話會更新,有時不會。
我檢查了req.sessionID
,它對於不同的請求總是相同的。
編輯 正確使用regenerate method作品,但並不理想,因爲我失去了一切會議。
你嘗試過調試的「會話」代碼本身的節省部分 - 與不'resave'參數組到'FALSE'? – raina77ow
你是指express-session包內的保存方法嗎? – Mark
是的。從代碼開始,您可以實際追蹤整個事情。關鍵是要了解會議何時被提取和存儲。 – raina77ow