我正在构建一个快速应用程序,它的数据库中有一个用户表和一个朋友表。好友表的要点是成为一个多对多表,用于跟踪用户之间的好友请求。由于朋友最终总是与用户联系在一起,因此我希望朋友的快速路由成为用户路由器的子路由器。但是,我的父路由中的 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{
// validate that request follows friendNewSchema
const validator = jsonschema.validate(req.body, friendNewSchema);
if( !validator.valid ) {
const errs = validator.errors.map(e => e.stack);
throw new BadRequestError(errs);
}
// make new request with Friend.request
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 json of friendRequest with a status code of 201
return res.status(201).json({ friendRequest });
}
catch (err) {
return next(err);
}
});
我遇到的具体问题是,路由是 /users/:username/friends/request/:receiver 但当我的朋友路由被调用时, :username 路由变量从未定义。我检查了中间件函数,它从不触及/修改 req.params 对象。我该怎么做才能让子路由访问父路由变量?
如果
req.params.username
仍然未定义或不正确,请检查以下几点:
req.params
(如果有)的中间件不会干扰预期值。mergeParams: true
是否应用于正确的路由器(在您的情况下为 router
)。console.log
或调试工具在中间件链中的各个点检查 req.params
,以了解其填充方式。中间件问题示例: 如果有一个中间件在您的路线之前运行并修改
req.params
,它可能会影响您的预期行为。
例如:
router.use('/:username/friends', (req, res, next) => {
// Some middleware that modifies req.params
req.params.username = 'someDefaultUsername'; // This could override your intended behavior
next();
});
router.post("/request/:receiver", ensureCorrectUserOrAdmin, async function (req, res, next) {
// Now req.params.username might not be what you expect
});
确保此类中间件不会无意中修改
req.params.username
。