摘要:問題描述在使用作為路由遇到了一個(gè)優(yōu)先級問題如下代碼在訪問時(shí)路由會(huì)優(yōu)先匹配到路由返回這個(gè)問題就很尷尬了項(xiàng)目空閑下來去翻看源碼終于找到了原因問題原因的源碼并不長和兩個(gè)文件加起來共一千多行代碼建議可以結(jié)合這篇文章閱讀其中造成這個(gè)問題的原因
問題描述
在使用Koa-router作為路由遇到了一個(gè)優(yōu)先級問題.如下代碼
// routerPage.js file const router = require("koa-router") router.get("/test", ctx => { ctx.body = "test" }) router.get("/router/test", ctx => { ctx.body = "router test" }) module.exports = router // routerIndex.js file const router = require("koa-router") const routerPage = require("./routerPage") router.use(routerPage.routes(), routerPage.allowedMethods()) module.exports = router
在訪問"/router/test"時(shí)路由會(huì)優(yōu)先匹配到"/test"路由,返回ctx.body = "test",這個(gè)問題就很尷尬了,項(xiàng)目空閑下來去翻看源碼終于找到了原因
問題原因Koa-router的源碼并不長,layer.js和router.js兩個(gè)文件加起來共一千多行代碼.建議可以結(jié)合這篇文章閱讀.
其中造成這個(gè)問題的原因就是router.js中router.use這個(gè)方法,方法源碼如下
// 主要作用: 給path添加中間件 Router.prototype.use = function () { var router = this; var middleware = Array.prototype.slice.call(arguments); var path = "(.*)"; // 如果path為array則遞歸調(diào)用use方法 if (Array.isArray(middleware[0]) && typeof middleware[0][0] === "string") { middleware[0].forEach(function (p) { router.use.apply(router, [p].concat(middleware.slice(1))); }); return this; } //如果傳入了path,則只對此path操作 var hasPath = typeof middleware[0] === "string"; if (hasPath) { path = middleware.shift(); } // 如果傳入?yún)?shù)為一個(gè)路由數(shù)組,則遍歷為每個(gè)路由添加前綴,中間件,并將此路由放入全局的路由數(shù)組 middleware.forEach(function (m) { if (m.router) { m.router.stack.forEach(function (nestedLayer) { if (path) nestedLayer.setPrefix(path); if (router.opts.prefix) nestedLayer.setPrefix(router.opts.prefix); router.stack.push(nestedLayer); }); if (router.params) { Object.keys(router.params).forEach(function (key) { m.router.param(key, router.params[key]); }); } } else { router.register(path, [], m, { end: false, ignoreCaptures: !hasPath }); } }); return this; };
問題就出在router.use(routerPage.routes(), routerPage.allowedMethods())時(shí)沒有設(shè)置前綴,
路由就自動(dòng)添加了默認(rèn)的前綴"(.*)",這里的path發(fā)生了改變,在路由后續(xù)的操作中,將path使用pathToRegExp轉(zhuǎn)換成正則表達(dá)式時(shí)"/test"這個(gè)path本應(yīng)該是/^/test...../就會(huì)變成/(.*)//test...(大概是這個(gè)意思)
那么原本以/test開頭的路由就會(huì)匹配包含/test的路由
所以request path 為/router/test時(shí)會(huì)被/test路由先匹配中,路由也就不會(huì)往下匹配
將條件更精確的路由放到前面
在/test那個(gè)路由中加一個(gè)中間件,當(dāng)匹配到/router/test時(shí) await next()繼續(xù)向下執(zhí)行
更改源碼Router.propertype.use 中 path = "(.*)" 為 path = false
在使用router.use時(shí)代碼做一定更改,代碼如下
// routerPage.js file const router = require("koa-router") router.get("test", ctx => { ctx.body = "test" }) router.get("router/test", ctx => { ctx.body = "router test" }) module.exports = router // routerIndex.js file const router = require("koa-router") const routerPage = require("./routerPage") router.use("/", routerPage.routes(), routerPage.allowedMethods()) module.exports = router
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88300.html
路由koa-router——MVC 中重要的環(huán)節(jié):Url 處理器 ?? iKcamp 制作團(tuán)隊(duì) 原創(chuàng)作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校對:李益、大力萌、Au、DDU、小溪里、小哈 風(fēng)采主播:可木、阿干、Au、DDU、小哈 視頻剪輯:小溪里 主站運(yùn)營:給力xi、xty 教程主編:張利濤 視頻地址:https://www.cctalk.com/v/151...
摘要:本文首發(fā)于用控制路由在中長這樣還有上的框架兩者都用來控制路由,這樣寫的好處是更簡潔更優(yōu)雅更清晰。反觀或上的路由完全差了一個(gè)檔次從開始就有了,只是瀏覽器和都還沒有支持。 本文首發(fā)于:用Decorator控制Koa路由 showImg(https://segmentfault.com/img/remote/1460000015348698); 在Spring中Controller長這樣 @...
摘要:第三篇,有關(guān)生態(tài)中比較重要的一個(gè)中間件第一篇源碼閱讀第二篇源碼閱讀與是什么首先,因?yàn)槭且粋€(gè)管理中間件的平臺(tái),而注冊一個(gè)中間件使用來執(zhí)行。這里寫入的多個(gè)中間件都是針對該生效的。 第三篇,有關(guān)koa生態(tài)中比較重要的一個(gè)中間件:koa-router 第一篇:koa源碼閱讀-0 第二篇:koa源碼閱讀-1-koa與koa-compose koa-router是什么 首先,因?yàn)閗oa是一個(gè)管...
摘要:我們分別使用這樣的原則來測試向每個(gè)架構(gòu)注入個(gè)靜態(tài)路由,測試最末尾的那個(gè)。而我們?nèi)绾巫龅竭_(dá)到的性能,主要我們在內(nèi)存中維護(hù)了一份靜態(tài)路由列表,能讓程序以最快的速度找到我們需要的。 對比 如果使用nodejs來搭建Service服務(wù),那么我們首選express或者koa,而fastify告訴我們一個(gè)數(shù)據(jù): Framework Version Router? Requests/sec ...
摘要:代碼結(jié)構(gòu)執(zhí)行流程上面兩張圖主要將的整體代碼結(jié)構(gòu)和大概的執(zhí)行流程畫了出來,畫的不夠具體。那下面主要講中的幾處的關(guān)鍵代碼解讀一下。全局的路由參數(shù)處理的中間件組成的對象。 代碼結(jié)構(gòu) showImg(https://segmentfault.com/img/remote/1460000007468236?w=1425&h=1772); 執(zhí)行流程 showImg(https://segmentf...
閱讀 2225·2019-08-30 15:53
閱讀 2454·2019-08-30 12:54
閱讀 1204·2019-08-29 16:09
閱讀 730·2019-08-29 12:14
閱讀 757·2019-08-26 10:33
閱讀 2483·2019-08-23 18:36
閱讀 2960·2019-08-23 18:30
閱讀 2121·2019-08-22 17:09