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

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

【玩轉(zhuǎn)Koa之koa-router原理解析】一、前言
Koa為了保持自身的簡(jiǎn)潔 , 并沒(méi)有捆綁中間件 。但是在實(shí)際的開(kāi)發(fā)中 , 我們需要和形形色色的中間件打交道 , 本文將要分析的是經(jīng)常用到的路由中間件 -- koa-router 。
如果你對(duì)Koa的原理還不了解的話 , 可以先查看Koa原理解析 。
二、koa-router概述
koa-router的源碼只有兩個(gè)文件:router.js和layer.js , 分別對(duì)應(yīng)Router對(duì)象和Layer對(duì)象 。
Layer對(duì)象是對(duì)單個(gè)路由的管理 , 其中包含的信息有路由路徑(path)、路由請(qǐng)求方法(method)和路由執(zhí)行函數(shù)(middleware) , 并且提供路由的驗(yàn)證以及params參數(shù)解析的方法 。
相比較Layer對(duì)象 , Router對(duì)象則是對(duì)所有注冊(cè)路由的統(tǒng)一處理 , 并且它的API是面向開(kāi)發(fā)者的 。
接下來(lái)從以下幾個(gè)方面全面解析koa-router的實(shí)現(xiàn)原理:
Layer對(duì)象的實(shí)現(xiàn)
路由注冊(cè)
路由匹配
路由執(zhí)行流程
三、Layer
Layer對(duì)象主要是對(duì)單個(gè)路由的管理 , 是整個(gè)koa-router中最小的處理單元 , 后續(xù)模塊的處理都離不開(kāi)Layer中的方法 , 這正是首先介紹Layer的重要原因 。

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


Layer構(gòu)造函數(shù)主要用來(lái)初始化路由路徑、路由請(qǐng)求方法數(shù)組、路由處理函數(shù)數(shù)組、路由正則表達(dá)式以及params參數(shù)信息數(shù)組 , 其中主要采用path-to-regexp方法根據(jù)路徑字符串生成正則表達(dá)式 , 通過(guò)該正則表達(dá)式 , 可以實(shí)現(xiàn)路由的匹配以及params參數(shù)的捕獲:
玩轉(zhuǎn)Koa之koa-router原理解析


根據(jù)paramNames中的參數(shù)信息以及captrues方法 , 可以獲取到當(dāng)前路由params參數(shù)的鍵值對(duì):
玩轉(zhuǎn)Koa之koa-router原理解析


需要注意上述代碼中的safeDecodeURIComponent方法 , 為了避免服務(wù)器收到不可預(yù)知的請(qǐng)求 , 對(duì)于任何用戶輸入的作為URI部分的內(nèi)容都需要采用encodeURIComponent進(jìn)行轉(zhuǎn)義 , 否則當(dāng)用戶輸入的內(nèi)容中含有'&'、'='、'?'等字符時(shí) , 會(huì)出現(xiàn)預(yù)料之外的情況 。而當(dāng)我們獲取URL上的參數(shù)時(shí) , 則需要通過(guò)decodeURIComponent進(jìn)行解碼 , 而decodeURIComponent只能解碼由encodeURIComponent方法或者類似方法編碼 , 如果編碼方法不符合要求 , decodeURIComponent則會(huì)拋出URIError , 所以作者在這里對(duì)該方法進(jìn)行了安全化的處理:
玩轉(zhuǎn)Koa之koa-router原理解析


Layer還提供了對(duì)于單個(gè)param前置處理的方法:
玩轉(zhuǎn)Koa之koa-router原理解析


上述代碼中通過(guò)some方法尋找單個(gè)param處理函數(shù)的原因在于以下兩點(diǎn):
保持param處理函數(shù)位于其他路由處理函數(shù)的前面;
路由中存在多個(gè)param參數(shù) , 需要保持param處理函數(shù)的前后順序 。
玩轉(zhuǎn)Koa之koa-router原理解析


Layer中的setPrefix方法用于設(shè)置路由路徑的前綴 , 這在嵌套路由的實(shí)現(xiàn)中尤其重要 。
最后 , Layer還提供了根據(jù)路由生成url的方法 , 主要采用path-to-regexp的compile和parse對(duì)路由路徑中的param進(jìn)行替換 , 而在拼接query的環(huán)節(jié) , 正如前面所說(shuō)需要對(duì)鍵值對(duì)進(jìn)行繁瑣的encodeURIComponent操作 , 作者采用了urijs提供的簡(jiǎn)潔api進(jìn)行處理 。
四、路由注冊(cè)
1、Router構(gòu)造函數(shù)
首先看了解一下Router構(gòu)造函數(shù):
玩轉(zhuǎn)Koa之koa-router原理解析


在構(gòu)造函數(shù)中初始化的params和stack屬性最為重要 , 前者用來(lái)保存param前置處理函數(shù) , 后者用來(lái)保存實(shí)例化的Layer對(duì)象 。并且這兩個(gè)屬性與接下來(lái)要講的路由注冊(cè)息息相關(guān) 。

推薦閱讀