express koa 中介軟體執行順序
express
和 koa
中介軟體是用於處理 http
請求和響應的,但是二者的設計思路確不盡相同。
express
中介軟體一個接一個的順序執行, 習慣於將response
響應寫在最後一箇中間件中;
而koa
的中介軟體執行順序是“洋蔥圈”模型。
其實中介軟體也是一種攔截器的思想
我們先看下express中介軟體的執行順序
得到的結果是
下面是koa中介軟體執行順序
const Koa = require('koa'); const app = new Koa(); app.use(async (ctx, next) => { console.log('1111'); await next(); // 呼叫下一個middleware console.log('2222'); }); app.use(async (ctx, next) => { console.log('333'); await next(); console.log('444'); }); app.use(async (ctx, next) => { await next(); console.log('555'); }); app.listen(3003); console.log('app started at port 3000...');
我們知道當一箇中間件呼叫 next() 該函式的時候會暫停並將控制傳遞給定義的下一個中介軟體。
當在下游沒有更多的中介軟體執行後,將會恢復執行其上游的中介軟體
執行的結果是:
app started at port 3000...
1111
333
555
444
2222
結果原因是當我們執行第一個中介軟體的時候打印出'111'此時 改中介軟體暫停將控制權交給
第二個中介軟體函式,在此說明中介軟體的執行順序很重要在具體業務中有的中介軟體要提前定義
第二個中介軟體的時候打印出'333'此時 中介軟體暫停將控制權交給第3箇中間件函式,
在第三個中介軟體的時候沒有先列印直接呼叫
await
但是沒有其他中介軟體下游沒有更多的中介軟體執行後,將會恢復執行其上游的中介軟體
但是會先打印出555因為這段列印程式碼也包含在最後一箇中間件裡面會先執行 以此向上一個執行打印出 444 在向上一個執行打印出222 相當於棧先進後出
如果我們改變一下最後一箇中間件
app.use(async (ctx, next) => {
//await next(); //註釋這行
console.log('555');
});
列印結果一樣是:
app started at port 3000...
1111
333
555
444
2222
最後得出的結果兩者都是相同的
所以實際上,express
的中介軟體也可以形成“洋蔥圈”模型,在 next
呼叫後寫的程式碼同樣會執行到,只不過express
中一般不會這麼做,因為 express
的response
一般在最後一箇中間件,所以其它中介軟體 next()
後的程式碼影響不到最終結果