koa2中介軟體實現原始碼解析

2021-09-11 12:51:21 字數 2347 閱讀 9153

眾所周知,koa2核心的部分就是middleware和context了,本文將從結合官網demo以及原始碼對其進行解讀

const koa = require('koa');

// x-response-time

const start = date.now();

await next();

const ms = date.now() - start;

ctx.set('x-response-time', `$ms`);

});// logger

const start = date.now();

await next();

const ms = date.now() - start;

console.log(`$

$ - $`);

});// response

ctx.body = 'hello world';

});複製**

根據上述**做的事,我們從2開始:

首先http.createrserver,ceateserver方法接受乙個函式作為引數,這個函式的兩個引數分別為request和response; 而在koa中接受乙個callback,就是下面**中的this.callback

listen(...args) 

複製**

上述callback已經執行,所以真正的createrserver接受的函式應該是callback的返回值,所以這和ceateserver方法接受乙個函式作為引數不矛盾,本質上都是一樣的,接下來看具體的callback函式

callback() ;

return handlerequest;

}複製**

返回值是const定義的handlerequest函式,這個函式首先建立乙個context(在context掛載http請求響應狀態等一些資訊),然後將建立好的ctx和乙個fn作為引數傳給了this.handlereguest;ctx很好理解,就是將一些http模組的req,res掛載到ctx上去,也就是我們koa的重要組成部分之一,請求上下文

createcontext(req, res) );

request.ip = request.ips[0] || req.socket.remoteaddress || '';

context.accept = request.accept = accepts(req);

context.state = {};

return context;

}複製**

關鍵是compose(this.middleware),他的引數this.middleware是個陣列,會在使用koa的use方法時,push進去函式,也就是我們開頭所提到的初始化中介軟體

use(fn) 

debug('use %s', fn._name || fn.name || '-');

return

this;

}複製**

再來看compose原始碼

function

compose (middleware)

/*** @param context

* @return

* @api public

*/return

function (context, next) ))

} catch (err) }}}

複製**

可以通過原始碼看出,傳遞給this.handlerequest(ctx, fn)的fn就是這個compose的返回值,乙個匿名函式: 接下裡我們先不看這個匿名函式,繼續看到this.handlerequest,既然已經明確了它的兩個引數ctx和fn:

handlerequest(ctx, fnmiddleware) 

複製**

之前說到fn就是compose返回的匿名函式,現在又將fn傳遞給了handlerequest,

控制權轉到fnmiddleware中,所以fnmiddlewar就是剛才我們沒有看的匿名函式,這裡通過尾遞迴呼叫依次控制執行中介軟體函式,

綜上就是所有內容了,如有問題或異議,懇請指出,不甚感激~

koa2 mysql 中介軟體 Koa2 中介軟體

1.什麼是koa2中介軟體?二 常用的五個中介軟體 1.koa 面向node.js的表示式http中介軟體框架,使web應用程式和api更加令人愉快地編寫。koa的中介軟體堆疊以類似堆疊的方式流動,允許您執行下游操作,然後過濾和處理上游的響應。ctx.body hello world 2.koa r...

koa2中介軟體原理

koa2中介軟體的執行就像洋蔥圈一樣,從外面到最裡面,再從最裡面到最外面。const koa require koa logger console.log 第一層洋蔥圈開始 await next const rt ctx.response.get x response time console.lo...

KOA中介軟體原始碼解析

告別 噩夢,從這裡開始 請看下面來自官網的 和執行順序 以上 的實現如果用 函式來實現,無疑是一場噩夢,而koa卻以十分優雅的方式實現了如下圖洋蔥圖一般的 核心是利用es6的新特性 generator 具體實現是利用koa的兩個niubi轟轟的模組 compose和cocompose模組,用於將所有...