什么叫中間件
在Koa中,中間件是指連貫整個(gè) Koa 應(yīng)用程序诬垂,并共享資源(上下文)的獨(dú)立插件劲室。
這里注意兩個(gè)詞:連貫與共享資源
- 連貫 對(duì)應(yīng)“next”
- 共享資源 對(duì)應(yīng)"context”。
中間件(middlewares)
如圖结窘,是一個(gè)基本的web服務(wù)器的模型很洋,服務(wù)器接受一個(gè)瀏覽器的request請(qǐng)求,然后返回一個(gè)response隧枫,一個(gè)個(gè)小箭頭指的就是中間件喉磁。為什么要畫(huà)成洋蔥這么一個(gè)形態(tài)谓苟,是因?yàn)椴还苁墙邮照?qǐng)求還是返回結(jié)果,都要經(jīng)過(guò)中間件协怒,所以中間件是一個(gè)環(huán)形的涝焙,只不過(guò),進(jìn)去和出來(lái)的過(guò)程經(jīng)過(guò)的中間件順序是相反的孕暇。
中間件的執(zhí)行順序
如圖仑撞,我們自定義三個(gè)中間件,每個(gè)中間件都在進(jìn)入和離開(kāi)的時(shí)候輸出一串代碼妖滔。
image.png
其中每個(gè)中間件的代碼如下:
function m1(ctx,next){
// console.log('m1',ctx.path);
}
module.exports = function(){
return async function(ctx,next){
console.log('m1 start')
m1(ctx)
await next();
console.log('m1 end')
}
}
m1,m2,m3中間件的主要區(qū)別在于console.log(m2 start)
,console.log('m2 end')
隧哮。
我們按照如下順序在app.js引入并使用3個(gè)中間件:
image.png
刷新頁(yè)面,我們可以在命令行中看到如下輸出:
image.png
可以看出铛楣,中間件的執(zhí)行順序是標(biāo)準(zhǔn)的堆棧(先進(jìn)后出)模型近迁。
中間件的執(zhí)行順序和中間件的引用順序沒(méi)有關(guān)系,和app.use()
的順序有關(guān)