1. Context 對象
Koa 提供一個 Context 對象,表示一次對話的上下文(包括 HTTP 請求和 HTTP 回復(fù))。通過加工這個對象,就可以控制返回給用戶的內(nèi)容。
Context.response.body屬性就是發(fā)送給用戶的內(nèi)容
const Koa = require('koa'); const App = new Koa(); const main = ctx => { ctx.response.body = 'Hello World'; }; app.use(main); app.listen(3000); 復(fù)制代碼
上面代碼中,main函數(shù)用來設(shè)置ctx.response.body。然后,使用app.use方法加載main函數(shù)。
你可能已經(jīng)猜到了,ctx.response代表 HTTP Response。同樣地,ctx.request代表 HTTP Request。
2. 路由
原生路由用起來不太方便,我們可以使用封裝好的koa-route模塊
const route = require('koa-route'); const about = ctx => { ctx.response.type = 'html'; ctx.response.body = '<a href="/">Index Page</a>'; }; const main = ctx => { ctx.response.body = 'Hello World'; }; app.use(route.get('/', main)); app.use(route.get('/about', about)); 復(fù)制代碼
3. 靜態(tài)資源
如果網(wǎng)站提供靜態(tài)資源(圖片、字體、樣式表、腳本......),為它們一個個寫路由就很麻煩,也沒必要。koa-static模塊封裝了這部分的請求。
const path = require('path'); const serve = require('koa-static'); const main = serve(path.join(__dirname)); app.use(main); 復(fù)制代碼
4. 中間件
const logger = (ctx, next) => { console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`); next(); } app.use(logger); 復(fù)制代碼
像上面代碼中的logger函數(shù)就叫做"中間件"(middleware),因為它處在 HTTP Request 和 HTTP Response 中間,用來實現(xiàn)某種中間功能。app.use()用來加載中間件。
基本上,Koa 所有的功能都是通過中間件實現(xiàn)的,前面例子里面的main也是中間件。每個中間件默認(rèn)接受兩個參數(shù),第一個參數(shù)是 Context 對象,第二個參數(shù)是next函數(shù)。只要調(diào)用next函數(shù),就可以把執(zhí)行權(quán)轉(zhuǎn)交給下一個中間件
5. express和koa中間件對比
express中間件是一個接一個的順序執(zhí)行 koa中間件是按照圓圈循環(huán)進(jìn)行,即從外層到內(nèi)層,又從內(nèi)層回到外層來結(jié)束。
- koa2的中間件是通過 async await 實現(xiàn)的,中間件執(zhí)行順序是“洋蔥圈”模型。 中間件之間通過next函數(shù)聯(lián)系,當(dāng)一個中間件調(diào)用 next() 后,會將控制權(quán)交給下一個中間件, 直到下一個中間件不再執(zhí)行 next() 后, 將會沿路折返,將控制權(quán)依次交換給前一個中間件。
- 與 koa2 中間件不同的是,express中間件一個接一個的順序執(zhí)行, 通常會將 response 響應(yīng)寫在最后一個中間件中 主要特點: app.use 用來注冊中間件 遇到 http 請求,根據(jù) path 和 method 判斷觸發(fā)哪些中間件 實現(xiàn) next 機(jī)制,即上一個中間件會通過 next 觸發(fā)下一個中間件