调用无参API端点持续报错:需传入12字节或24位十六进制字符串
问题解决思路
排查
getOrder处理函数内部逻辑
这个错误是MongoDB验证ObjectId格式时抛出的,说明函数里肯定有代码在尝试用不符合要求的字符串作为ObjectId查询。比如:- 有没有误写
Model.findById(req.params.id)这类代码,但当前路由根本没定义id参数,导致传入undefined或错误格式的字符串; - 有没有硬编码的测试ID格式错误,或者从缓存、其他接口获取的ID值不符合12字节/24位十六进制字符串要求。
- 有没有误写
确认实际请求的完整性
前端代码写的是无参数GET,但要检查浏览器Network面板里的实际请求:- 确认请求URL确实是
/api/campaign/order,没有被拦截添加额外路径或查询参数; - 检查请求头、Cookie里是否携带了后端会当作ObjectId处理的字段,且格式错误。
- 确认请求URL确实是
检查路由匹配顺序
如果后端有类似router.route("/campaign/:id")的路由,且定义在/campaign/order之前,那么请求/campaign/order时会被前者匹配,order会被当作:id参数传入对应的处理函数,而该函数如果用这个值去查MongoDB,就会触发ObjectId格式错误。这种情况要把精确匹配的/campaign/order路由放在带参数的路由前面。排查路由相关中间件
检查全局或该路由组的中间件,有没有中间件会从请求中提取数据并尝试转换为ObjectId,比如从header、query里取某个字段当作ID处理,而该字段值格式不符合要求。
内容的提问来源于stack exchange,提问作者ELsssss
相关产品推荐
相关产品推荐

