You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS嵌套路由中URL参数获取异常问题排查

Node.js嵌套路由参数获取问题解析

问题场景

以下是代码结构与出现的问题:

server.js

const routerProyecto = require('./routes/proyecto').routerProyecto;
app.use('/api/auth',routerAuth);
app.use('/api/proyecto',routerProyecto);

proyecto.js

routerProyecto.use("/:idProyecto/backlog",routerBacklog);
//...more post and get methods

backlog.js

const routerBacklog = express.Router();
routerBacklog.get("/listarBacklog",async(req,res)=>{
    const { tokenProyePUCP } = req.cookies;

    try{
        const payload = jwt.verify(tokenProyePUCP, secret);
        console.log(payload);
        const { idProyecto} = req.params;
        console.log(req.params);
        console.log(`Llegue a recibir solicitud listar backlog con id de Proyecto :  ${idProyecto}`);
        const query = `
            CALL LISTAR_PRODUCT_BACKLOG_X_ID_PROYECTO(?);
        `;
        try {
            const [results] = await connection.query(query,[idProyecto]);
            res.status(200).json({
                backlog: results[0],
                message: "Backlog obtenido exitosamente"
            });
            console.log(`Se han listado el backlog para el proyecto ${idProyecto}!`);
            console.log(results);
        } catch (error) {
            console.error("Error al obtener los proyectos:", error);
            res.status(500).send("Error al obtener los proyectos: " + error.message);
        }
    }catch(error){
        return res.status(401).send(error.message + " invalid tokenProyePUCP token");
    }

})

请求接口后,无法获取req.params.idProyecto参数,返回结果如下:

{
  "backlog": [],
  "message": "Backlog obtenido exitosamente"
}

问题原因与解决方法

问题出在Express子路由的参数传递机制上:默认情况下,子路由不会继承父路由的URL参数,必须显式开启参数合并。

修改backlog.js中创建路由的代码,添加mergeParams: true配置:

// 开启mergeParams选项,让子路由能访问父路由的参数
const routerBacklog = express.Router({ mergeParams: true });

设置该选项后,子路由就能接收到父路由(proyecto.js中定义的/:idProyecto)的参数,req.params.idProyecto即可正常获取到对应的值。

URL中间使用变量是否属于不良实践?

不属于,这种写法完全符合RESTful API的设计规范。比如/api/proyecto/:idProyecto/backlog的结构,清晰表达了资源的层级关系——某个具体项目下的Backlog资源,语义明确,便于开发者理解和维护。

只要参数命名贴合资源逻辑、清晰易懂,这种URL设计是推荐使用的。

内容的提问来源于stack exchange,提问作者Gabriel Duran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:13:40