1. 程式人生 > 資料庫 >express-session 的使用及負載均衡【session儲存到資料庫】

express-session 的使用及負載均衡【session儲存到資料庫】

package.json 檔案

{
  "name": "express07",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "connect-mongo": "^3.2.0",
    "express": "^4.17.1",
    "express-session": "^1.17.1"
  },
  "description": ""
}

 

app.js 檔案

// app.js
/*
session 的使用:
1、安裝 : npm i express-session --save ;
2、引入 : const session = require("express-session");
3、配置中介軟體:
app.use(
  session({
    secret: "this is session", // 伺服器生成 session 的簽名
    resave: false, //強制儲存 session 即使它並沒有變化
    saveUninitialized: true, //強制將為初始化的 session 儲存
    cookie: {
      maxAge: 1000 * 60 * 2,
      secure: false, // 為 true 時候表示只有 https 協議才能訪問cookie
    },
    rolling: true,//為 true 表示 超時前重新整理,cookie 會重新計時; 為 false 表示在超時前重新整理多少次,都是按照第一次重新整理開始計時。
  })
);
4、使用:
        設定: req.session.username ="張三"
        獲取: req.session.username 
 */
// -------------------------------------------------------------------------------------------------------------------------
/*
express-session 的常用方法:

    req.session.distroy((req, res) => {}); //銷燬所有session
    req.session.username = "張三"; //設定 session  username
    req.session.username; //獲取session
    req.session.cookie.maxAge = 0; //重新設定session的過期時間

 */

/*

銷燬session:

1、設定session的過期時間為0 , 所有的session都將會銷燬。
req.session.cookie.maxAge = 0;

2、銷燬指定的session,設定它為空
req.session.username = "";

distroy() ,表示銷燬所有的session
req.session.destroy();

 */
/*
多伺服器負載均衡,將session儲存到MongoDB資料庫中:(其他資料庫可以使用相對應的外掛,如:connect-redis,connect-mysql,具體使用方法請檢視相關文件)
1、安裝:
npm i connect-mongo --save
2、引入(放下 session下邊):
const MongoStore = require('connect-mongo')(session);
3、呼叫中介軟體:
// Advanced usage
app.use(session({
    store: new MongoStore({
        url: 'mongodb://user12345:foobar@localhost/test-app?authSource=admins&w=1',
        mongoOptions: advancedOptions // See below for details
    })
}));

 */

const express = require("express");
const session = require("express-session");
const MongoStore = require("connect-mongo")(session);
const app = express();
app.use(
  session({
    secret: "this is session", // 伺服器生成 session 的簽名
    resave: false, //強制儲存 session 即使它並沒有變化
    saveUninitialized: true, //強制將為初始化的 session 儲存
    cookie: {
      maxAge: 1000 * 60 * 10,
      secure: false, // 為 true 時候表示只有 https 協議才能訪問cookie
    },
    rolling: true, //為 true 表示 超時前重新整理,cookie 會重新計時; 為 false 表示在超時前重新整理多少次,都是按照第一次重新整理開始計時。
    store: new MongoStore({
      url: "mongodb://127.0.0.1:27017/shop",
      touchAfter: 3600 * 24,//不管發生多少次請求,在3600*24毫秒內,都只更新一次session,除非改變了session。
    }),
    // store: new MongoStore({
    //   url: "mongodb:127.0.0.1:27017/shop",
    //   // mongoOptions: advancedOptions, // See below for details
    // }),
  })
);

app.get("/", (req, res) => {
  if (req.session.username || req.session.age) {
    res.send(req.session.username + ":已經登入----年齡:" + req.session.age);
  } else {
    res.send("使用者未登入");
  }
});
app.get("/login", (req, res) => {
  req.session.username = "張三";
  req.session.age = 18;
  res.send("執行登入");
});

app.get("/loginOut", (req, res) => {
  //   1、設定session的過期時間為0 , 所有的session都將會銷燬。
  //   req.session.cookie.maxAge = 0;

  //   2、銷燬指定的session,設定它為空
  req.session.username = "";
  //  distroy() ,表示銷燬所有的session
  // req.session.destroy();

  res.send("退出登入");
});

app.listen(3009);
console.log("run server http://127.0.0.1:3009");