Express中调用/project/active却触发/project/:id路由如何解决?
问题原因
Express的路由匹配遵循从上到下依次匹配、命中即停止的规则。/project/:id中的:id是动态路由参数,可以匹配任意不含/的字符串,所以当你访问/project/active时,字符串active会被识别为id参数的值,直接命中排在前面的/project/:id路由,不会继续匹配后续的/project/active路由。
解决方法
- 调整路由定义顺序:把更精确的固定路由放在动态路由前面,访问
/project/active时会优先匹配到精确路由,不会被动态路由拦截。示例代码如下:
// 精确路由放前 router.get("/project/active", (req,res) => { console.log(2); }) // 动态路由放后 router.get("/project/:id", (req,res) => { console.log(1); });
- 给动态参数加正则约束:如果你的
id有固定格式(比如纯数字),可以给路由参数加正则匹配规则,只有参数符合格式时才会命中动态路由,active这类非符合要求的字符串自然不会触发匹配。示例代码如下:
// 仅id为数字时命中该路由 router.get("/project/:id(\\d+)", (req,res) => { console.log(1); }); router.get("/project/active", (req,res) => { console.log(2); })
- 增加路由分流逻辑:如果不方便调整路由顺序也不能加参数约束,可以在动态路由的处理逻辑中增加判断,当参数值为
active时调用next()交给后续路由处理。示例代码如下:
router.get("/project/:id", (req,res, next) => { if(req.params.id === 'active') { return next(); // 跳过当前路由,传递给下一个匹配路由 } console.log(1); }); router.get("/project/active", (req,res) => { console.log(2); })
内容的提问来源于stack exchange,提问作者Sree Sajai
相关产品推荐
相关产品推荐

