Express父路由req.params无法传递给子路由的问题解决
问题
开发Express应用时,数据库包含users和friends表(后者用于记录用户好友请求的多对多关联)。将好友路由设为用户路由的子路由后,子路由无法获取父路由的:username参数。路由路径为/users/:username/friends/request/:receiver,调用时req.params.username始终未定义,已确认中间件未修改req.params对象。
用户路由配置:
const friendRoutes = require("./friends"); const router = express.Router({ mergeParams: true }); router.use('/:username/friends', friendRoutes);
好友路由代码:
router.post("/request/:receiver", ensureCorrectUserOrAdmin, async function (req, res, next) { try{ // 验证请求格式 const validator = jsonschema.validate(req.body, friendNewSchema); if( !validator.valid ) { const errs = validator.errors.map(e => e.stack); throw new BadRequestError(errs); } // 创建好友请求 console.log("Friend Request Body: ", req.body); console.log("Friend Request Params: ", req.params); const friendRequest = await Friend.request(req.params.username, req.params.receiver); console.log("Successfully made Friend Request: ", friend); return res.status(201).json({ friendRequest }); } catch (err) { return next(err); } });
解决方案
问题根源是**mergeParams配置位置错误**:需要在子路由(friendRoutes对应的Router实例)中开启该选项,而非父路由。
修改步骤:
- 在
friends.js中创建Router时添加mergeParams: true:
// friends.js const express = require('express'); const router = express.Router({ mergeParams: true }); // 关键:开启参数合并 router.post("/request/:receiver", ensureCorrectUserOrAdmin, async function (req, res, next) { // 原有逻辑保持不变 }); module.exports = router;
- 父路由的Router无需设置
mergeParams,调整为:
// 用户路由文件 const express = require('express'); const friendRoutes = require("./friends"); const router = express.Router(); // 移除mergeParams配置 router.use('/:username/friends', friendRoutes);
原理:
Express子路由默认不会合并父路由的req.params,只有当子路由的Router实例启用mergeParams: true时,才会将父路由的参数合并到当前请求的req.params中。之前把配置加在父路由,导致子路由无法获取到:username参数。
内容的提问来源于stack exchange,提问作者Crablub
相关产品推荐
相关产品推荐

