{}) 支持所有的HTTP動詞注冊方式 , 例如:router.all('/users', ctx。玩轉(zhuǎn)Koa之koa-router原理解析( 二 )。" />

日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

玩轉(zhuǎn)Koa之koa-router原理解析( 二 )


koa-router中提供兩種方式注冊路由:
具體的HTTP動詞注冊方式 , 例如:router.get('/users', ctx => {})
支持所有的HTTP動詞注冊方式 , 例如:router.all('/users', ctx => {})
2、http METHODS
源碼中采用methods模塊獲取HTTP請求方法名 , 該模塊內(nèi)部實現(xiàn)主要依賴于http模塊:

玩轉(zhuǎn)Koa之koa-router原理解析


3、router.verb() and router.all()
這兩種注冊路由的方式的內(nèi)部實現(xiàn)基本類似 , 下面以router.verb()的源碼為例:
玩轉(zhuǎn)Koa之koa-router原理解析


該方法第一部分是對傳入?yún)?shù)的處理 , 對于middleware參數(shù)的處理會讓大家聯(lián)想到ES6中的rest參數(shù) , 但是rest參數(shù)與arguments其中一個致命的區(qū)別:
rest參數(shù)只包含那些沒有對應形參的實參 , 而arguments則包含傳給函數(shù)的所有實參 。
如果采用rest參數(shù)的方式 , 上述函數(shù)則必須要求開發(fā)者傳入name參數(shù) 。但是也可以將name和path參數(shù)整合成對象 , 再結合rest參數(shù):
玩轉(zhuǎn)Koa之koa-router原理解析


采用ES6的新特性 , 代碼變得簡潔多了 。
第二部分是register方法 , 傳入的method參數(shù)的形式就是router.verb()與router.all()的最大區(qū)別 , 在router.verb()中傳入的method是單個方法 , 后者則是以數(shù)組的形式傳入HTTP所有的請求方法 , 所以對于這兩種注冊方法的實現(xiàn) , 本質(zhì)上是沒有區(qū)別的 。
4、register
玩轉(zhuǎn)Koa之koa-router原理解析


register方法主要負責實例化Layer對象、更新路由前綴和前置param處理函數(shù) , 這些操作在Layer中已經(jīng)提及過 , 相信大家應該輕車熟路了 。
5、use
熟悉Koa的同學都知道use是用來注冊中間件的方法 , 相比較Koa中的全局中間件 , koa-router的中間件則是路由級別的 。
Router.prototype.use = function () {
玩轉(zhuǎn)Koa之koa-router原理解析


koa-router中間件注冊方法主要完成兩項功能:
將路由嵌套結構扁平化 , 其中涉及到路由路徑的更新和param前置處理函數(shù)的插入;
路由級別中間件通過注冊一個沒有method的Layer實例進行管理 。
五、路由匹配
玩轉(zhuǎn)Koa之koa-router原理解析


match方法主要通過layer.match方法以及methods屬性對layer進行篩選 , 返回的matched對象包含以下幾個部分:
path: 保存所有路由路徑被匹配的layer;
pathAndMethod: 在路由路徑被匹配的前提下 , 保存路由級別中間件和路由請求方法被匹配的layer;
route: 僅當存在路由路徑和路由請求方法都被匹配的layer , 才能算是本次路由被匹配上 。
另外 , 在ES7之前 , 對于判斷數(shù)組是否包含一個元素 , 都需要通過indexOf方法來實現(xiàn) , 而該方法返回元素的下標 , 這樣就不得不通過與-1的比較得到布爾值:
玩轉(zhuǎn)Koa之koa-router原理解析


而作者巧妙地利用位運算省去了“討厭的-1” , 當然在ES7中可以愉快地使用includes方法:
玩轉(zhuǎn)Koa之koa-router原理解析


六、路由執(zhí)行流程
理解koa-router中路由的概念以及路由注冊的方式 , 接下來就是如何作為一個中間件在koa中執(zhí)行 。
koa中注冊koa-router中間件的方式如下:
玩轉(zhuǎn)Koa之koa-router原理解析


從代碼中可以看出koa-router提供了兩個中間件方法:routes和allowedMethods 。

推薦閱讀