本地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
相关产品推荐
相关产品推荐

