基于Node.js+Express的REST API实现MongoDB价格筛选功能报错求助
问题排查与修复方案
错误原因
- 误用Mongoose的
find方法:Mongoose的find方法不支持传入JavaScript数组过滤式的回调函数作为参数,传入回调会导致Mongoose查询参数解析异常,触发Query was already executed报错;同时回调执行时会拿到空/Null文档,触发读取price属性的类型错误。 - 空值判断逻辑错误:
Phone.find返回值为匹配结果的数组,无匹配数据时返回空数组,永远不会为null,原有!phone的判断逻辑完全不生效。 - 缺少必要的异常拦截:没有校验传入的price参数是否为合法数字,且发送404响应后没有终止代码执行,会触发重复发送响应的报错。
提示:请确保你的Phone模型中
price字段定义为Number类型,避免字符串与数字匹配失败的问题。
修复后代码
router.get("/:price", async (req, res) => { try { // 校验参数合法性 const targetPrice = parseInt(req.params.price); if (isNaN(targetPrice)) { return res.status(400).send('请传入合法的价格数字'); } // 传入Mongoose标准查询对象格式 const phones = await Phone.find({ price: targetPrice }); // 修正空结果判断逻辑 if (phones.length === 0) { return res.status(404).send('未找到对应价格的手机数据'); } res.send(phones); } catch (e) { res.status(500).send('Error ' + e); } })
内容的提问来源于stack exchange,提问作者Myroslava
相关产品推荐
相关产品推荐

