啓動流程
koa 主要的啓動流程就是下面的 4 步:引入 koa 包 => 實例化 koa => 編寫中間件 => 監聽服務器
const koa = require('koa');
const app = new koa();
app.use(function 1(){})
app.use(function 2(){})
app.use(function 3(){})
app.listen(port,function(){})
引入 koa 包
引入 koa 包其實就是引入的一個 繼承於 node 原生的 events 類的 Application 類
module.exports = class Application extends Emitter {
constructor() {
super();
this.proxy = false;
this.middleware = [];
this.subdomainOffset = 2;
this.env = process.env.NODE_ENV || 'development';
this.context = Object.create(context);
this.request = Object.create(request);
this.response = Object.create(response);
}
listen(...args) {}
toJSON() {}
inspect() {}
use(fn) {}
callback() {}
handleRequest(ctx, fnMiddleware) {}
createContext(req, res) {}
onerror(err) {}
};
其中就包含了
listen 、use
等原型方法
實例化 koa
執行 constructor ,將
ctx、response、request
等對象封裝在 koa 實例中
編寫中間件
use(fn) {
if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
if (isGeneratorFunction(fn)) {
deprecate('Support for generators will be removed in v3. ' +
'See the documentation for examples of how to convert old middleware ' +
'https://github.com/koajs/koa/blob/master/docs/migration.md');
fn = convert(fn);
}
debug('use %s', fn._name || fn.name || '-');
this.middleware.push(fn);
return this;
}
- 首先判斷 fn 的類型,不是方法直接拋錯
- 是生成器函數的話用 co 封裝
- 是 async 函數的話直接放入中間件數組中
- 測試了一下,若是是普通函數的話,1.X 版本會報錯,2.X 版本能夠執行,可是因爲沒有 next,只能執行第一個
use 的做用就是把中間件函數依次放入
ctx.middleware
中,等待請求到來的時候順序調用
監聽服務器
listen(...args) {
debug('listen');
const server = http.createServer(this.callback()); // 這裏註冊了 node 的 request 事件
return server.listen(...args);
}
koa 的監聽主要有兩個封裝:
- 封裝原生的
node sever
監聽
- 封裝
koa.callback()
,而且爲這個服務器設置了 node 的 request
事件,這意味着當每個請求到來時就會執行 koa.callback() 方法,這是極爲關鍵的一步,是 koa 中間件原理的基礎
下回分解
下一章咱們會講解中間件的原理
END