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

本地Express.js API携带query参数请求报Cannot GET错误如何解决

问题根因

你混淆了**路径参数(path params)和查询参数(query params)**的匹配规则,这是接口返回404的直接原因。
你当前在路由文件中定义的router.get("/:id", getUserDataById)属于路径参数路由,这类路由要求id作为URL路径的固定分段存在,不会匹配?后携带的查询串内容。
你发起的请求URL http://localhost:3000/api/v1/users?id=120622 实际匹配的路径是/api/v1/users,路径中没有携带对应id的分段,完全匹配不到你定义的/:id路由,因此返回Cannot GET /api/v1/users错误。

解决方案

根据你实际的传参需求二选一即可:

方案1:保留当前路由定义,改用路径参数传参

如果你要沿用router.get("/:id", getUserDataById)的路由写法,请求URL不能带?拼接参数,要把id直接写在路径里:

http://localhost:3000/api/v1/users/120622

在控制器函数中,通过req.params.id即可获取到传入的id值120622,示例代码:

const getUserDataById = (req, res) => {
  const userId = req.params.id;
  // 执行后续查询用户数据的逻辑
}

方案2:保留当前传参格式,修改路由定义

如果你要沿用?id=xxx的查询参数传参格式,需要把路由文件中的接口定义修改为匹配根路径的GET路由:

router.get("/", getUserDataById);

在控制器函数中,通过req.query.id即可获取到传入的id值120622,示例代码:

const getUserDataById = (req, res) => {
  const userId = req.query.id;
  // 执行后续查询用户数据的逻辑
}
核心规则备忘
  • 路径参数是URL路径的组成部分,格式为/资源名/参数值,通过req.params获取,路由定义时需要用:参数名占位
  • 查询参数是URL中?后拼接的键值对,格式为/资源名?参数名=参数值,通过req.query获取,路由定义时不需要额外占位,匹配对应路径的请求即可
  • 两种传参方式对应完全不同的路由匹配逻辑,不能交叉混用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:42:15