close

KOA可以透過koa.use( func... )替這個Web服務在處理Request時掛入許多的中間套件(middleware)或者說是中繼的函式。

它的邏輯與Win32中的Hooks Chain類似,意即在掛上自己的middleware/hook的同時,也必須記得呼叫下一個負責的單位,是屬於一種共同維護與協作的形式,否則將會使訊息的傳遞斷在你手上而結束。

 

最常用的middleware肯定是router與json-parser莫屬,前者透過正則路由可使Request進入到對應的處理單元,而json-parser則是可以讓Request的body在處理之前先行解釋成JSON格式(當然前提是JSON格式的Body)。

 

同理,假如希望自己的Request/Response在進入Router或JsonParse之前先進行一段共通的處理,或者是在回應給前端前做一些手腳,都可以追加自訂的middleware進行處理

舉例來說像我吃飽太閒喜歡替Body加密,由於前端並非網頁瀏覽器,而是自己的mobile app,就可以做到對Body加解密的工作,又或者是Token的先行驗證等等功能。

 

以下是自己的範例,目的在於對傳來的Request Body先行做XOR解密,以前對要傳回去的Response作後製的XOR加密

 

app.js

var koa = require('koa'),
    app = koa(),
    koarouter = require('koa-router'),
    router = koarouter(),
    bodyParser = require('koa-bodyparser'),
    postProcess = require('my-post-process'),
    preProcess = request('my-pre-process');

router.get('/hello', function *() {
    this.body = 'Hello World';
});

//掛上需要的middleware後啟動Server
app.use(preProcess());
app.use(postProcess());
app.use(bodyParser());
app.use(router.middleware());
app.listen(3001);

 

my-pre-process.js

module.exports = function () 
{
    return function*(next) 
    {
        //將傳來的Request解密
        this.request.body = util.XOREncryptDecrypt(this.req);

       //自己使用完後交付給下一個middleware
        yield* next;
    }
};

 

my-post-process.js

module.exports = function () 
{
    return function*(next) 
    {
        //先讓其他middleware進行工作
        yield* next;

        //加密
        var encrypedBody = util.XOREncryptDecrypt(this.body);

        //替換成新的Body
        this.body = encrypedBody;
    }
};

 

有習慣對Request/Response做分析紀錄的人也可以透過追加middleware去進行一些Log的統計

 

arrow
arrow
    文章標籤
    nodejs koa middleware
    全站熱搜

    不來嗯 發表在 痞客邦 留言(0) 人氣()