Koa.js重叠路由无法正常工作,不调整路由顺序如何访问第二个接口?
问题原因
Koa Router 按照路由注册顺序依次匹配请求,调用/my/abc/create接口时,第一个路由/my/:path/:id会优先匹配::path 匹配到值abc,:id 匹配到值create,触发非数字校验逻辑直接返回400,因此永远无法命中第二个路由。
原示例代码存在笔误:cox.params.id应为ctx.params.id。
解决方案(无需调整路由注册顺序)
方案1:给第一个路由的
:id参数添加数字正则约束
该方案为最优解,直接限制第一个路由仅在最后一段为纯数字时才会匹配,非数字路径会自动向后匹配其他路由,修改后代码如下:var Router = require('koa-router'); var router = Router(); // 给id参数添加\d+正则规则,仅匹配纯数字 router.get('/my/:path/:id(\\d+)', (ctx) =>{ if (isNaN(Number(ctx.params.id))) { ctx.status = 400; return; } console.log('route id') }) router.get('/my/:path/create', (ctx) =>{ console.log('route create') })注意正则中的
\d需要使用双反斜杠转义,\\d+代表匹配1位及以上的纯数字。方案2:在第一个路由的非数字逻辑中调用
next传递请求
若不需要修改路由定义规则,可给第一个路由的处理函数新增next参数,当id不符合数字要求时不直接返回400,调用next()让请求继续匹配后续路由即可:var Router = require('koa-router'); var router = Router(); // 新增next参数 router.get('/my/:path/:id', async (ctx, next) =>{ if (isNaN(Number(ctx.params.id))) { // 不直接返回响应,将请求交给后续路由处理 await next(); return; } console.log('route id') }) router.get('/my/:path/create', (ctx) =>{ console.log('route create') })
内容的提问来源于stack exchange,提问作者Pytan
相关产品推荐
相关产品推荐

