實際引用中,有些公司在不一樣地區會設置不一樣服務器,所以就須要用到nginx以實現負載均衡,這時,將session數據保存至數據庫就成爲了須要面對的問題,咱們以MySQL數據庫爲例,看看他是如何將數據上傳至mysql中的。
在npm上有一個叫作:express-mysql-session的模塊,主要用於將數據上傳至mysql數據庫,如下爲他的實現方式:javascript
var express = require('express'); var app = module.exports = express(); var session = require('express-session'); var MySQLStore = require('express-mysql-session')(session); var options = { host: 'localhost', port: 3306, user: 'session_test', password: 'password', database: 'session_test' //數據庫名 }; var sessionStore = new MySQLStore(options); app.use(session({ key: 'session_cookie_name', //自行設置的簽名 secret: 'session_cookie_secret', //密匙 store: sessionStore, //存儲管理器 resave: false, saveUninitialized: false }));
session story會在內部建立一個MySQL鏈接池,用於處理數據庫的鏈接。
數據庫鏈接池因爲能夠實現鏈接複用,避免了數據庫鏈接頻繁創建、關閉的開銷。默認狀況下,鏈接池由1個鏈接組成,但可使用connectionlimit選項覆蓋此鏈接。你也能夠設置額外的鏈接池option選項。java
當使用默認選項時,存儲session數據庫的表會被自動建立;mysql
1.首先在數據庫中咱們須要有一個存儲數據的數據庫:nginx
2.安裝如下模塊:sql
const express=require("express"); const mysql=require("mysql"); const cors=require("cors"); //處理跨域 const session=require("express-session"); const MySQLStore=require('express-mysql-session')(session); //鏈接mysql主要模塊
3.鍵入以下代碼便可上傳至mysql數據庫:數據庫
const express=require("express"); const mysql=require("mysql"); const cors=require("cors"); const session=require("express-session"); const MySQLStore=require('express-mysql-session')(session); var app=express(); // 配置mysql var options = { host: 'localhost', port: 3306, user: 'root', password: '123456', database: 'session' }; var sessionConnection = mysql.createConnection(options); var sessionStore = new MySQLStore({ expiration: 10800000, createDatabaseTable: true, //是否建立表 schema: { tableName: 'session_tab', //表名 columnNames: { //列選項 session_id: 'session_id', expires: 'expires', data: 'data' } } }, sessionConnection); //配置中間件 app.use(session({ key: 'aid', secret: "keyboard cat", store: sessionStore, resave: false, saveUninitialized: true, cookie: ('name', 'value',{ maxAge: 5*60*1000, secure: false, name: "seName", resave: false}) })); app.use(cors()); app.use('/login',function(req,res){ //設置session req.session.userinfo='張三'; res.send("登錄成功!"); }); app.use('/loginOut',function(req,res){ //註銷session req.session.destroy(function(err){ res.send("退出登陸!"+err); }); }); app.use('/',function(req,res){ //獲取session if(req.session.userinfo){ res.send("hello "+req.session.userinfo+",welcome to index"); }else{ res.send("未登錄"); } }); app.listen(8080);
這時啓動咱們的服務器:express
進入http://localhost:8080/時顯示未登陸:npm
從新鏈接如mysql:跨域
咱們能夠看到,這時session自動建立了session_tab表,但表上並無相應的名稱,只有配置信息,接下來在瀏覽器中進入login路由:瀏覽器
咱們只需重連mysql數據庫,就可看到關於用戶信息也有了:
當瀏覽器進入loginOut路由後,會執行req.session.destroy操做,將session銷燬,而數據庫表中的用戶信息也將銷燬:
重連數據庫後:
固然你們也可根據本身的實際需求來發揮,這裏不在進行更多闡述。