Express子路由router如何无需在每个路由中指定完整路径
解决方案
你只需要调整子路由的挂载方式即可,核心修改点如下:
- 父路由挂载子路由时使用
use方法直接指定路径前缀,不要加/*通配符 - 子路由内定义接口路径直接写相对前缀的路径即可
修改后的完整代码示例:
const mainRouter = express.Router(); const bananaRouter = express.Router(); const appleRouter = express.Router(); // 子路由内直接写相对路径即可,最终实际路径为 /banana/hello bananaRouter.get('/hello', (req, res) => { /* ... */ }); // 直接指定前缀挂载子路由,不要加/* mainRouter.use('/banana', bananaRouter); mainRouter.use('/apple', appleRouter);
原理解释
你之前的写法用all('/banana/*', bananaRouter)时,Express会把完整的请求路径传递给子路由做匹配,所以子路由需要写全/banana/hello才能匹配成功。
改为用use('/banana', bananaRouter)挂载后,Express会自动剥离路径中的/banana前缀,只把剩余部分传递给子路由匹配,因此子路由只需要写/hello就可以对应到完整路径/banana/hello。
附加说明
如果你后续需要在子路由中获取父路由路径上的参数,可以在创建子路由时开启mergeParams配置:
const bananaRouter = express.Router({ mergeParams: true });
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

