如何在ExpressJs router中实现路由精确匹配
Express路由精确匹配解决方案
问题根因
Express 路由匹配遵循先定义先匹配的规则,默认采用前缀匹配逻辑:只要请求路径的前缀和已定义的路由匹配成功,就会触发对应处理函数,不会继续校验后续路径。你当前把通用路由/task/定义在具体路由/task/seed/之前,所以/task/seed/请求会先命中/task/的匹配规则,触发Controller.retrieveAll。
解决方法
你可以根据自己的业务场景选择以下任意一种方案:
- 方案1:调整路由定义顺序
把更具体的路由放在通用路由前面,优先匹配窄范围路由,匹配成功后就不会走后续更通用的路由:// 先定义具体的子路由 router.get("/task/seed/", Controller.seed); // 再定义通用的父路由 router.get("/task/", Controller.retrieveAll); - 方案2:开启路由严格匹配模式
你可以在创建路由实例时开启strict参数,开启后路径末尾的斜杠会被纳入匹配校验规则,完全匹配才会触发路由:// 创建路由时开启严格模式 const router = express.Router({ strict: true }); // 全局开启严格路由的写法 // app.set('strict routing', true) - 方案3:给通用路由添加路径结束标识
在通用路由的路径末尾添加正则结束符$,强制只有路径完全匹配的时候才会触发当前路由:// $ 表示路径匹配到此处结束,不会匹配后续带其他路径的请求 router.get("/task/$", Controller.retrieveAll); router.get("/task/seed/", Controller.seed);
内容的提问来源于stack exchange,提问作者Asad Ullah Khalid
相关产品推荐
相关产品推荐

