API GET路由无返回值:按用户邮箱查询行程列表失败
问题排查与修复方案
以下是导致接口无返回值的核心问题及对应修复方式:
1. 请求参数不匹配
你定义了const email = req.params.email;,但查询条件里却用req.params.userEmail,二者完全不统一。如果路由参数是/itineraries/:email,req.params.userEmail根本取不到有效数值,查询条件会变成{userEmail: undefined},自然查不到数据,甚至引发后续逻辑异常。
修复:统一参数名,比如都使用email:
const email = req.params.email; Itinerary.find({userEmail: email})
若路由参数是/:userEmail,则将变量名改为userEmail,保持前后一致即可。
2. 空数据判断逻辑错误
Mongoose的find()方法无论是否查到数据,都会返回数组——无匹配数据时返回空数组[],而空数组在JavaScript中属于「真值」,所以!data永远为false,不会触发404响应。如果数据库中没有该用户的行程,代码会返回空数组,若前端未处理空数组场景,可能会误以为没有返回值。
修复:通过数组长度判断是否存在数据:
if (data.length === 0) res.status(404).send({ message: "Not found Itinerary with email " + email }); else res.send(data);
3. 未定义变量引发潜在报错
404提示信息中使用了userEmail变量,但该变量从未声明,会触发ReferenceError直接进入catch块。若服务器未配置错误日志,你可能看不到这个报错,但会导致响应异常。
修复:使用已定义的email变量:
res.status(404).send({ message: "Not found Itinerary with email " + email });
4. 错误信息与业务不符
catch块中的错误信息写的是「Some error occurred while retrieving tutorials.」,和行程(itinerary)业务不匹配,排查时容易误导,建议修改为对应业务的描述:
err.message || "Some error occurred while retrieving itineraries."
修复后的完整代码
exports.findAllByEmail = (req, res) => { const email = req.params.email; Itinerary.find({ userEmail: email }) .then(data => { if (data.length === 0) res.status(404).send({ message: "Not found Itinerary with email " + email }); else res.send(data); }) .catch(err => { res.status(500).send({ message: err.message || "Some error occurred while retrieving itineraries." }); }); }
额外排查点
- 确认
Itinerary模型是否正确关联itinerary集合:Mongoose默认会将模型名转为复数(比如itineraries),若数据库集合名是单数itinerary,需要在模型定义中指定collection: 'itinerary'。 - 用Postman或curl直接调用接口,查看响应状态码和具体内容,不要仅依赖前端反馈——比如返回200但空数组是数据问题,返回500则查看具体错误信息。
- 核对数据库中是否确实存在该
userEmail对应的行程数据。
内容的提问来源于stack exchange,提问作者prettyMaria
相关产品推荐
相关产品推荐

