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的統計
文章標籤
全站熱搜
留言列表