1. 程式人生 > >express koa 中介軟體執行順序

express koa 中介軟體執行順序

expresskoa 中介軟體是用於處理 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

next();

但是沒有其他中介軟體下游沒有更多的中介軟體執行後,將會恢復執行其上游的中介軟體

但是會先打印出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中一般不會這麼做,因為 expressresponse一般在最後一箇中間件,所以其它中介軟體 next() 後的程式碼影響不到最終結果