session 在 web 應用中使用很廣泛,不過在 node 上面,要用 session 還真得折騰一番才行。node
從加入中間件,到 session 的寫入、清除,當時是遇到了很多坑的。mysql
固然也多是我研究還不夠透徹,我所寫的只是我在實際使用中的所得與總結。git
當中若是有什麼不對的地方,還望見諒 and 指正了~github
首先安裝必要模塊,打開命令行工具,進入到項目根目錄,執行下面指令:web
npm install express-session --save
npm install express-mysql-session --save
而後容我一番啪啪啪,啪啪啪...省略一萬字...sql
OK,此次咱們不用看項目的目錄結構了,由於徹底沒有變化,只是在代碼上作了修改,下面咱們看看幾個修改後的文件的代碼express
PS:標紅部分是修改過或新增的npm
app.js:json
var express = require('express'), path = require('path'), favicon = require('serve-favicon'), logger = require('morgan'), cookieParser = require('cookie-parser'), bodyParser = require('body-parser'), routes = require('./routes/main'), mysql = require('mysql'), settings = require('./data/settings'), session = require('express-session'), SessionStore = require('express-mysql-session'), //生成一個 SessionStore 實例 sessionStore = new SessionStore({ host: settings.host, port: settings.port, user: settings.user, password: settings.password, database: settings.database, schema: { tableName: 'session', columnNames: { session_id: 'id', expires: 'expires', data: 'data' } } }, mysql.createConnection(settings)), //生成一個 express 實例 app = express(); //指定 web 應用的標題欄小圖標的路徑爲:/static/favicon.ico app.use(favicon(path.join(__dirname, 'static', 'favicon.ico'))); //加載日誌中間件 app.use(logger('dev')); //加載解析 json 的中間件 app.use(bodyParser.json()); //加載解析 urlencoded 請求體的中間件 app.use(bodyParser.urlencoded({ extended: false })); //加載解析 cookie 的中間件 app.use(cookieParser()); //設置 static 文件夾爲存放靜態文件的目錄 app.use(express.static(path.join(__dirname, 'static'))); //加載解析 session 的中間件 app.use(session({ key: settings.sessionKey, secret: settings.sessionSecret, cookie: { maxAge: 6 * 60 * 60 * 1000 }, store: sessionStore, rolling: true, resave: false, saveUninitialized: false })); //配置路由 routes(app); //捕獲404錯誤,並轉發到錯誤處理器 app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); //錯誤處理器 if (app.get('env') === 'development') { //開發環境下的錯誤處理器,將錯誤信息渲染 error 模版並顯示到瀏覽器中 app.use(function(err, req, res, next) { res.status(err.status || 500); res.send('error', { code: 0, msg: err.message, error: err }); }); } app.use(function(err, req, res, next) { //生產環境下的錯誤處理器,不會將錯誤信息泄露給用戶 res.status(err.status || 500); res.send('error', { code: 0, msg: err.message }); }); //導出 app 實例供其餘模塊調用 module.exports = app;
嗯嗯~~這就完了。瀏覽器
納尼,才那麼點東西,大失所望?
可憐我當時爲了這玩意那折騰啊...
爲了基於 mysql 來實現 session,而且確保 session 的成功寫入,讀取,以及移除...這些代碼都是通過一番摸索以後才折騰出來。
緣由是官方文檔是英文的,並且翻譯後也看不懂,只能慢慢試。
市面上關於 express-session 和 express-mysql-session 的中文資料也是少之又少...
當時我是何等的苦不堪言啊...以致於就算是如今,依然對其原理半知不解,囧rz...
只能爲你們送上兩個傳送門,但願有大神參透後能不吝指點迷津吧...
express-session github:https://github.com/expressjs/session
express-mysql-session github:https://github.com/chill117/express-mysql-session
上面兩個 github 裏有很詳細的文檔說明(固然是英文),因爲這裏我只是成功實現的個人需求,但還沒徹底參透,因此就不班門弄斧去給代碼添加詳細註釋了。
想追根究底的,請自行移步去研究。拿來主義者直接 C+V 吧。
session 的寫入很簡單
req.session.userName = 'admin';
session 的讀取也很簡單,像上面寫入的值,直接訪問 req.session 對應屬性就能夠了
req.session.userName
session 的移除(指的是從數據表中移除)
req.sessionStore.destroy(req.session.id, function (err) { if (err) throw err; //do something ... });
OK,到目前爲止。整個基礎項目的搭建就基本完成了。
static目錄下面的工做就是徹底的客戶端工做流了,不在討論之列。
至於接口的細節實現,後面頗有可能還會用到的模塊 crypto,它是 node 自帶,不用安裝。用於數據加密的。
關鍵字給出了,怎麼折騰就是各展神通了。
還有像 connect-flash,ldap,memcached 等東東,這裏也僅給出關鍵字。由於他們不屬於基礎,而屬於拓展加強。
有須要的自行深造參悟吧~