關於express下session的幾個注意事項
阿新 • • 發佈:2019-02-02
使用nodejs開發web應用之所以快,其中一個重要原因是非常齊全的第三方模組,你幾乎可以找到任何想要的module
。express-session
是express
WEB框架常用的session
管理包。其主要有如下幾個配置選項:
- cookie : 用於設定sessionID cookie選項,如過期時間,cookie適用的路徑等。
- name : sessionID 對應的cookie名。
- resave : 強制把session寫入儲存,即使session在整個請求過程中都沒有被修改。
- saveUninitialized : 儲存新建的但沒有被改動的session。
- secret : 加密sessionID cookie的金鑰。
1、 session併發問題
resave
選項如果配置為true
,而實際的運用場景有併發請求並且依賴session
的情況下就得注意了。因為問題在於,一個請求設定得資料可能被另外一個請求重寫覆蓋了。 對於一些有併發的伺服器,需要把該選項配置為false
。當然這隻能解決session
資訊覆蓋的問題。 並不能很好解決session
資料一致性問題,比如說:使用者首先發送一個更新session
的請求,該請求依賴於其他伺服器的應答,而後續的其他請求依賴於最新得session
資訊否則必須給以錯誤得應答。這個時候我們必須手動更新session
session
資訊的併發請求序列化。
Promise.resolve()
.then(function() {
req.session.user.gameKey = null;
req.session.user.companyId = null;
return syncUserSession(req);
})
.then(function() {
//....
});
function updateUserInfo(user) {
return new Promise(function(resolve, reject) {
user.gameKey = gameKey;
user.companyId = user.companyIdSrc;
user.save(function() {
req.session.user = user;
});
});
}
2、 合理搭配中介軟體得順序
express-session
作為幾個基礎中介軟體,每次請求都有建立物件,分配記憶體,儲存資料等一系列操作。實際上,伺服器上一些資源得應答沒有使用到session
。所以我們可以把它提前。當然也可以把沒有使用到session
得使用者中介軟體提前。
//靜態資源
app.use('/public', express.static(staticDir));
app.use(require('cookie-parser')(config.session_secret));
app.use(session({
secret: config.session_secret,
store: new RedisStore({
port: config.redis_port,
host: config.redis_host
}),
resave: false,
saveUninitialized: true
}));
cookie-parser
模組解析cookie
資料,隨後得session
模組根據sessionID cookie
管理會話資料。 把靜態資源服務提前避免不必要得session
操作。