Express嵌套路由中slug参数无法传递至子router的问题求助
解决Express嵌套路由中req.params为空的问题
我在Express里把categoryRouter挂载到带参数的父路由路径/:productId/category下,但子路由里的req.params始终是空对象,拿不到父路由的productId参数。
示例代码如下:
index.js
const express = require('express'); const productsRouter = require('./products-router'); const app = express(); const port = 3000; const apiRouter = express.Router(); apiRouter.use('/products', productsRouter); app.use('/api', apiRouter); app.listen(port, () => { console.log(`Example app listening on port ${port}`); });
products-router.js
const express = require('express'); const categoryRouter = require('./category-router'); const productsRouter = express.Router(); productsRouter.get('/', (req, res) => { res.send('[GET] - Products root!'); }); productsRouter.use('/:productId/category', categoryRouter); module.exports = productsRouter;
category-router.js(原问题版本)
const express = require('express'); const categoryRouter = express.Router(); categoryRouter.get('/', (req, res) => { console.log(req.params); // 输出 {} res.send('[GET] - categoryRouter root!'); }); categoryRouter.post('/', (req, res) => { console.log(req.params); // 输出 {} res.send('[POST] - categoryRouter root!'); }); module.exports = categoryRouter;
解决方案
问题出在Express的子路由默认不会合并父路由的URL参数,只要在创建子路由时添加mergeParams: true配置即可解决:
修改category-router.js:
const express = require('express'); // 启用mergeParams,让子路由能访问父路由的参数 const categoryRouter = express.Router({ mergeParams: true }); categoryRouter.get('/', (req, res) => { console.log(req.params); // 现在会输出 { productId: '传入的参数值' } res.send('[GET] - categoryRouter root!'); }); categoryRouter.post('/', (req, res) => { console.log(req.params); // 现在会输出 { productId: '传入的参数值' } res.send('[POST] - categoryRouter root!'); }); module.exports = categoryRouter;
启用这个配置后,父路由里定义的productId参数会被合并到子路由的req.params对象中,子路由就能正常获取到该参数了。
内容的提问来源于stack exchange,提问作者Cache
相关产品推荐
相关产品推荐

