Express.Router同前缀路由中/:id与其他路由冲突无法共存问题
问题原因
Express 路由采用从上到下的优先匹配规则,带有动态参数的路由(如/:id)会匹配任意符合路径段格式的字符串。你当前的路由顺序中,get("/:id")定义在/mypets、/myadoptions之前,当请求/pets/mypets时,会先被/:id路由匹配,将mypets作为id参数传入getPetById方法。该方法尝试将非数字的mypets转为整数查询数据库,最终抛出类型不匹配的 Sequelize 错误,和路由数量没有任何关系。
解决方法
- 调整路由定义顺序,将固定路径的路由全部放在动态参数路由之前,修正后代码如下:
petRouter.get("/", petController.getAll); // 所有固定路径路由放在动态路由前 petRouter.get("/mypets", verifyToken, petController.getAllUserAdoptions); petRouter.get("/myadoptions", verifyToken, petController.getAllUserAdoptions); // 动态参数路由放在最后 petRouter.get("/:id", petController.getPetById);
- 可选优化:如果
id参数仅支持整数格式,可以给动态路由加正则校验,进一步避免错误匹配:
// 仅当id为数字时才会匹配该路由 petRouter.get("/:id(\\d+)", petController.getPetById);
补充说明
Express 本身没有路由数量限制,你遇到的是框架内置的路由匹配优先级规则导致的问题,只要遵循「固定路径路由在前、动态参数路由在后」的定义规则即可避免同类问题。
内容的提问来源于stack exchange,提问作者rafaelpadu
相关产品推荐
相关产品推荐

