【Express系列】第4篇——使用session

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-flashldapmemcached 等東東,這裏也僅給出關鍵字。由於他們不屬於基礎,而屬於拓展加強。

有須要的自行深造參悟吧~

相關文章
相關標籤/搜索