MongoDB findOne查询异常:传入不同coinId仍提示币种已存在
问题排查方案
- 优先校验请求实际参数
先确认你控制台打印的coinId取值和你Postman传入的是否完全一致:- 检查是否存在前后空格、大小写拼写差异
- 确认是否有OPTIONS预检请求被路由到该接口:OPTIONS请求默认不会携带请求体,此时
req.body.coinId为undefined,如果你的数据库中存在coinId为null、undefined或者缺省该字段的记录,findOne({coinId: undefined})会匹配到对应记录,触发重复判断
- 核对Mongoose模型定义
确认Coin模型中coinId的字段类型和你传入的参数类型是否匹配:比如模型定义coinId为Number类型,你Postman传的是字符串格式的数字,Mongoose查询时会自动做类型转换匹配到同值的数值类型记录,属于正常逻辑,按需调整字段类型或者参数传值格式即可 - 确认数据库连接和脏数据
- 检查当前接口连接的数据库是否为你预期的测试库,避免误连已经存有对应
coinId记录的生产库 - 查看你代码中打印的
console.log(coinExists)结果,确认匹配到的记录的coinId是否真的和你传入的一致,排查是否有之前测试留下的脏数据
- 检查当前接口连接的数据库是否为你预期的测试库,避免误连已经存有对应
- 额外优化建议
可以在参数校验阶段先判断coinId是否为空,避免无意义的数据库查询:
同时你当前代码在if (!coinId) { return res.status(400).send({ message: 'coinId is required' }) }res.send之后直接throw new Error,如果没有配置对应的错误捕获逻辑,可能会导致进程抛出未捕获异常,建议改为return结束函数执行即可。
内容的提问来源于stack exchange,提问作者deagleshot32
相关产品推荐
相关产品推荐

