koa2 中間件里面的next到底是什么


https://www.cnblogs.com/cloud-/p/7239819.html

 

const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) => {
  const start = Date.now();
 await next();
  const ms = Date.now() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}`);
});
app.listen(3000);

 

我們順藤摸瓜,打開 koa里面的application.js (或者直接debug進入),

1.首先看 use ,就是push一個函數到 this.middleware

2. 再看listen, 方法里面 http.createServer(this.callBack), this.callBack返回的是 function(req,res){......}的函數,連起來就是 http.createServer(function(req,res){....}),標准的http創建服務的方法

3.  最后看callback,里面的核心方法, compose(this.middleware) 返回一個promise,處理完畢后再執行 handleResponse

這三個連起來,就是每次請求的時候,先進入callback, compose中間件,執行完畢后,接着處理請求。那剩下的重點變為 compose 

 

 

 與上面的參數對應關系如下

context :ctx,

next : function next(){ return dispatch(i+1)}

所以 await next() 就等於 await function next(){ return dispatch(i+1)} , 而 dispatch(i+1)就進入了下一個中間件了。

 

核心就是 dispatch(i+1),也就是dispatch(1) , dispatch本身返回promise, 所以你就在這里 await 。

依此類推 disptach(1) 會執行 this.middleware[1],  那個時候 fn就為 logger執行的函數,就這么推下去。

關於結束,還是 next 不存在的時候。 結果完畢后,再依次往上走。

所以執行的順序是越先注冊越后執行, 當然還得看你 await next() 放在什么位置。 因為這里我的 console.log都放在了 await的后面,都放到前面,結果如何,親自測試一下嘍。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM