koa框架中對next()的理解
阿新 • • 發佈:2018-12-12
const one = (ctx, next) => { console.log('>> one'); next(); console.log('<< one'); } const two = (ctx, next) => { console.log('>> two'); next(); console.log('<< two'); } const three = (ctx, next) => { console.log('>> three'); next(); console.log('<< three'); } app.use(one); app.use(two); app.use(three); 輸出結果: >> one >> two >> three << three << two << one
Next的作用
我們在定義express中介軟體函式的時候都會將第三個引數定義為next,這個next函式主要負責將控制權交給下一個中介軟體,如果當前中介軟體沒有終結請求,並且next沒有被呼叫,那麼當前中介軟體的請求將被掛起,等到next()後的中介軟體執行完再返回繼續執行。總結來說,就是:
從第一個中介軟體開始執行,遇到next進入下一個中介軟體,一直執行到最後一箇中間件,在逆序,執行上一個中介軟體next之後的程式碼,一直到第一個中介軟體執行結束才發出響應。如下程式碼
one = (ctx, next) => { console.log('>> one'); next();----------------> two = (ctx, next) => { console.log('>> two'); next();------------------> three = (ctx, next) => { console.log('>> three'); next();--------------------| //沒有下一層,所以不再跳往下一層,直接執行當前層的下一步 console.log('<< three');<--| } console.log('<< two'); } console.log('<< one'); }
Koa 的最大特色,就是中介軟體(middleware)Koa 應用程式是一個包含一組中介軟體函式的物件,它是按照類似堆疊的方式組織和執行的。Koa中使用app.use()
用來載入中介軟體,基本上Koa 所有的功能都是通過中介軟體實現的。
每個中介軟體預設接受兩個引數,第一個引數是 Context 物件,第二個引數是next
函式。只要呼叫next
函式,就可以把執行權轉交給下一個中介軟體。每一箇中間件就相當於洋蔥的一層,請求從最外層進去,然後從最裡層出來,每個中介軟體都會執行兩次。three已經是最裡層的中介軟體了,所以next()只是執行next後的程式碼,然後一層一層返回
下圖為經典的Koa洋蔥模型