如何在Postman响应中返回Mongoose验证错误信息
解决Mongoose验证错误返回至Postman响应的问题
问题根源
send.save()是异步方法,未添加await导致错误无法被try/catch捕获,直接抛出到终端引发服务器崩溃。catch块变量名错误:参数为error,但代码中使用了未定义的err.message。- Mongoose验证错误属于
ValidationError类型,需提取字段对应错误信息,而非直接返回error.message。 - 额外问题:
phone用Number类型不合理,电话号码可能含前导零且本质是字符串,建议改为String类型。
修改后的代码
1. 更新schema.js
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const SomeModelSchema = new Schema({ phone: { type: String, // 改为String类型,适配电话号码特性 required: true, unique: true, validate: { validator: (val) => { const re = /^\d{10}$/; return re.test(val); // required已确保有值,无需判断!val }, message: 'Provided phone number is invalid.' }, }, }); module.exports = mongoose.model("SomeModel", SomeModelSchema);
2. 更新Post方法
router.post("/admin/add_profile", async (req, res) => { try { const send = new SomeModel({ phone: req.body.phone, }); await send.save(); // 添加await,捕获异步操作错误 res.json({ responseMessage: "Everything worked as expected", }); } catch (error) { // 处理Mongoose字段验证错误 if (error.name === 'ValidationError') { const errors = Object.values(error.errors).map(err => err.message); return res.status(400).json({ error: true, errorMessages: errors }); } // 处理手机号重复的唯一键错误 if (error.code === 11000) { return res.status(400).json({ error: true, errorMessage: 'Phone number already exists.' }); } // 处理其他未知服务器错误 res.status(500).json({ error: true, errorMessage: 'Server error occurred.' }); } });
效果说明
- 添加
await send.save()后,异步操作错误会被try/catch捕获,避免服务器崩溃。 - 针对
ValidationError提取具体字段错误信息,以JSON格式返回至Postman。 - 额外处理了手机号重复的唯一键冲突错误,覆盖
unique属性带来的异常场景。 - 改为
String类型存储手机号,避免前导零丢失问题。
内容的提问来源于stack exchange,提问作者sumanth.js
相关产品推荐
相关产品推荐

