什么是koa?
由 Express 原班人馬打造的 koa,致力于成為一個(gè)更小、更健壯、更富有表現(xiàn)力的 Web 框架。使用 koa 編寫 web 應(yīng)用,通過組合不同的 generator,可以免除重復(fù)繁瑣的回調(diào)函數(shù)嵌套,并極大地提升常用錯(cuò)誤處理效率。Koa 不在內(nèi)核方法中綁定任何中間件,它僅僅提供了一個(gè)輕量優(yōu)雅的函數(shù)庫,使得編寫 Web 應(yīng)用變得得心應(yīng)手。
什么是中間件?
中間件是一種獨(dú)立的系統(tǒng)軟件或服務(wù)程序,分布式應(yīng)用軟件借助這種軟件在不同的技術(shù)之間共享資源。中間件位于客戶機(jī)/ 服務(wù)器的操作系統(tǒng)之上,管理計(jì)算機(jī)資源和網(wǎng)絡(luò)通訊。是連接兩個(gè)獨(dú)立應(yīng)用程序或獨(dú)立系統(tǒng)的軟件。相連接的系統(tǒng),即使它們具有不同的接口,但通過中間件相互之間仍能交換信息。執(zhí)行中間件的一個(gè)關(guān)鍵途徑是信息傳遞。通過中間件,應(yīng)用程序可以工作于多平臺或OS環(huán)境。

如圖
koa的中間件模型?

如圖
koa的中間件采用的是洋蔥模型,每一次對于程序的訪問,都會(huì)從外向內(nèi)依次經(jīng)過每一個(gè)中間件,再依次由內(nèi)向外。
如何手寫一個(gè)中間件?
下面實(shí)現(xiàn)一個(gè)用戶記錄用戶訪問記錄,服務(wù)返回時(shí)間的中間件為例。
const koa = require('koa')
const app = new koa()
const port = 3000
// middleware1 - logger
app.use(async (ctx, next) => {
console.log(1)
await next()
console.log(2)
const rt = ctx.response.get('X-Response-Time')
logger.info(`${ctx.method} ${ctx.url} - ${rt}`)
})
// middleware2 - x-response-time
app.use(async (ctx, next) => {
console.log(3)
const start = Date.now()
await next()
console.log(4)
const ms = Date.now() - start
ctx.set('X-Response-Time', `${ms}ms`)
})
app.use(ctx => {
console.log(5)
ctx.body = 'hello world!'
})
app.listen(port, () => {
console.log(`server start success at port ${port}`)
})
await next 意思就是跳過當(dāng)前的程序執(zhí)行下一個(gè)中間件, 所以當(dāng)用戶訪問該程序時(shí)打出的日志就是1-3-5-4-2