Only methods that are common to nearly all HTTP servers are integrated directly into Koa's small ~570 SLOC codebase. This includes things like content negotiation, normalization of node inconsistencies, redirection, and a few others.
Koa is not bundled with any middleware.
Koa 是一個(gè)輕量型的HTTP 框架,它本身不會(huì)跟任何的中間件綁定颜及, 基本上我們常用的一些功能例如koa-router, koa-bodyparser 等都是以插件形式與Koa結(jié)合使用赫冬。
Koa的基本使用.
// response
app.use(ctx => {
ctx.body = 'Hello Koa';
});
app.listen(3000, () => {
console.log('listen at 3000 host')
})
這樣短短的幾行設(shè)置其實(shí)就能把一個(gè)http server 跑起來(lái)亲铡。
Koa provides a Request object as the request property of the Context.
Koa's Request object provides helpful methods for working with http requests which delegate to an IncomingMessage from the node http module.
另外通過(guò)ctx可以拿到request和response對(duì)請(qǐng)求體和返回體進(jìn)行操縱,但實(shí)際上盒蟆,koa除了提供ctx
參數(shù)之外断箫,還提供了一個(gè)next
參數(shù)。
具體用法如下:
const delay = () => Promise.resolve(resolve => setTimeout(() => resolve(), 2000));
// tag1
app.use(async (ctx, next) => {
ctx.body = "1";
await next();
ctx.body += "5";
});
//tag2
app.use(async (ctx, next) => {
ctx.body += "2";
await delay();
await next();
ctx.body += "6";
});
//tag3
app.use(async (ctx, next) => {
ctx.body += "3";
});
上面代碼的具體輸出為 12365, 具體原因
- 這里調(diào)用了三次use椅棺,所以koa會(huì)按照 tag1 -> tag2 -> tag3 的順序執(zhí)行.
- 當(dāng)每次碰到調(diào)用了next 函數(shù)的時(shí)候會(huì)先跳到下一次tag執(zhí)行犁罩。
- 所有的tag都按順序執(zhí)行完了之后,會(huì)從后到前依次執(zhí)行next函數(shù)后的代碼两疚。
這樣就構(gòu)成了一個(gè)類似洋蔥的模型.
tag1 tag2 tag3 里邊的每一個(gè)async (ctx, next) => {}
相當(dāng)于這里從外到里的每一個(gè)中間件床估, 執(zhí)行的過(guò)程類似于拿一根針往洋蔥里邊插入,到最深點(diǎn)后再逐層返回鬼雀。于是這里的插入過(guò)程就是123顷窒, 返回過(guò)程就是65。
當(dāng)然實(shí)際使用的時(shí)候tag1 tag2 tag3 會(huì)換成功能更強(qiáng)大更完善的各類插件 來(lái)實(shí)現(xiàn) registry, statusCode redirect源哩, errorhandle 等功能,如下圖所示:
以上就是我對(duì)Koa框架的基本使用以及模型的理解, 目前打算下一篇會(huì)自己手?jǐn)]一個(gè)帶核心功能的Koa框架鸦做。