Node.js Express嵌套路由父路径定义的:chatId参数子路由不识别解决方法
实现方法
完全可以将:chatId参数保留在路由入口索引文件中定义,无需下沉到子路由文件,核心是创建Express Router实例时开启原生的mergeParams配置项即可。
代码修改步骤
- 路由入口索引文件无需调整,保持最初的路径定义写法:
module.exports = (app) => { app.use(`${config.baseUrl}/chats`, chatsRoute); app.use(`${config.baseUrl}/chats/:chatId/messages`, messagesRoute); }
- 修改
messagesRoute文件的Router创建逻辑,传入{ mergeParams: true }配置,子路由依然使用/匹配挂载的父路径即可:
// 开启mergeParams配置后,父路径定义的路由参数会自动合并到子路由的参数对象中 const router = require("express").Router({ mergeParams: true }); router.route("/").get((req, res) => { // 此处可直接读取父路径定义的chatId参数 const { chatId } = req.params; somefunction(req, res); }); module.exports = router;
实现原理
- Express默认创建的Router实例做了参数隔离,默认配置下子路由仅能识别自身路由路径上声明的参数,无法读取父级挂载路径中定义的参数,这就是最初写法拿不到
chatId的根本原因 - 开启
mergeParams: true后,子路由的req.params对象会自动合并父路由路径上的所有参数,子路由自身定义的参数优先级高于父级同名参数,不会出现参数冲突问题 - 该配置是Express 4.5+版本原生支持的能力,无需引入额外第三方依赖,对原有业务逻辑无侵入
内容的提问来源于stack exchange,提问作者shany119
相关产品推荐
相关产品推荐

