1. 程式人生 > >關於express下session的幾個注意事項

關於express下session的幾個注意事項

使用nodejs開發web應用之所以快,其中一個重要原因是非常齊全的第三方模組,你幾乎可以找到任何想要的moduleexpress-sessionexpressWEB框架常用的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操作。