为什么我的 Express 父路由不会将 req.params 对象传递给其子路由?

问题描述 投票:0回答:1

我正在构建一个快速应用程序,它的数据库中有一个用户表和一个朋友表。好友表的要点是成为一个多对多表,用于跟踪用户之间的好友请求。由于朋友最终总是与用户联系在一起,因此我希望朋友的快速路由成为用户路由器的子路由器。但是,我的父路由中的 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 对象。我该怎么做才能让子路由访问父路由变量?

javascript express routes nested middleware
1个回答
0
投票

如果

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

© www.soinside.com 2019 - 2024. All rights reserved.