眾所周知,koa2核心的部分就是middleware和context了,本文將從結合官網demo以及原始碼對其進行解讀
const koa = require('koa');
// x-response-time
const start = date.now();
await next();
const ms = date.now() - start;
ctx.set('x-response-time', `$ms`);
});// logger
const start = date.now();
await next();
const ms = date.now() - start;
console.log(`$
$ - $`);
});// response
ctx.body = 'hello world';
});複製**
根據上述**做的事,我們從2開始:
首先http.createrserver,ceateserver方法接受乙個函式作為引數,這個函式的兩個引數分別為request和response; 而在koa中接受乙個callback,就是下面**中的this.callback
listen(...args)
複製**
上述callback已經執行,所以真正的createrserver接受的函式應該是callback的返回值,所以這和ceateserver方法接受乙個函式作為引數不矛盾,本質上都是一樣的,接下來看具體的callback函式
callback() ;
return handlerequest;
}複製**
返回值是const定義的handlerequest函式,這個函式首先建立乙個context(在context掛載http請求響應狀態等一些資訊),然後將建立好的ctx和乙個fn作為引數傳給了this.handlereguest;ctx很好理解,就是將一些http模組的req,res掛載到ctx上去,也就是我們koa的重要組成部分之一,請求上下文
createcontext(req, res) );
request.ip = request.ips[0] || req.socket.remoteaddress || '';
context.accept = request.accept = accepts(req);
context.state = {};
return context;
}複製**
關鍵是compose(this.middleware),他的引數this.middleware是個陣列,會在使用koa的use方法時,push進去函式,也就是我們開頭所提到的初始化中介軟體
use(fn)
debug('use %s', fn._name || fn.name || '-');
return
this;
}複製**
再來看compose原始碼
function
compose (middleware)
/*** @param context
* @return
* @api public
*/return
function (context, next) ))
} catch (err) }}}
複製**
可以通過原始碼看出,傳遞給this.handlerequest(ctx, fn)的fn就是這個compose的返回值,乙個匿名函式: 接下裡我們先不看這個匿名函式,繼續看到this.handlerequest,既然已經明確了它的兩個引數ctx和fn:
handlerequest(ctx, fnmiddleware)
複製**
之前說到fn就是compose返回的匿名函式,現在又將fn傳遞給了handlerequest,
控制權轉到fnmiddleware中,所以fnmiddlewar就是剛才我們沒有看的匿名函式,這裡通過尾遞迴呼叫依次控制執行中介軟體函式,
綜上就是所有內容了,如有問題或異議,懇請指出,不甚感激~
koa2 mysql 中介軟體 Koa2 中介軟體
1.什麼是koa2中介軟體?二 常用的五個中介軟體 1.koa 面向node.js的表示式http中介軟體框架,使web應用程式和api更加令人愉快地編寫。koa的中介軟體堆疊以類似堆疊的方式流動,允許您執行下游操作,然後過濾和處理上游的響應。ctx.body hello world 2.koa r...
koa2中介軟體原理
koa2中介軟體的執行就像洋蔥圈一樣,從外面到最裡面,再從最裡面到最外面。const koa require koa logger console.log 第一層洋蔥圈開始 await next const rt ctx.response.get x response time console.lo...
KOA中介軟體原始碼解析
告別 噩夢,從這裡開始 請看下面來自官網的 和執行順序 以上 的實現如果用 函式來實現,無疑是一場噩夢,而koa卻以十分優雅的方式實現了如下圖洋蔥圖一般的 核心是利用es6的新特性 generator 具體實現是利用koa的兩個niubi轟轟的模組 compose和cocompose模組,用於將所有...