为何Mongoose错误对象中无消息?用户注册API唯一字段重复问题
问题描述
我正在开发一个用户注册API,其中name和email字段被设置为唯一值。当提交包含已存在邮箱的JSON数据时,虽触发了预期的错误,但该错误对象中没有可用于生成友好提示的消息。
返回的错误对象如下:
{ "index": 0, "code": 11000, "keyPattern": { "email": 1 }, "keyValue": { "email": "pranatkarode@rocketmail.com" } }
我的控制器模块代码:
const User=require("../models/userModels.js"); exports.signUp=(req,res)=>{ const user=new User(req.body); user.save((err,user)=>{ if(err){ res.send(err) } else{ res.json({ user }) } }) }
解决方案
通过判断MongoDB的重复键错误码11000,解析错误对象里的keyPattern和keyValue字段,就能生成友好的提示消息。修改后的控制器代码如下:
const User=require("../models/userModels.js"); exports.signUp=(req,res)=>{ const user=new User(req.body); user.save((err,user)=>{ if(err){ // 处理MongoDB唯一索引冲突错误 if(err.code === 11000){ const duplicateField = Object.keys(err.keyPattern)[0]; const duplicateValue = err.keyValue[duplicateField]; return res.status(400).json({ message: `${duplicateField} "${duplicateValue}" 已被注册,请更换后重试` }); } // 处理其他类型错误 return res.status(500).json({ message: "服务器内部错误", error: err.message }); } res.status(201).json({ message: "注册成功", user }) }) }
代码说明
- 先判断错误码是否为
11000(MongoDB唯一索引冲突的专属错误码) - 用
Object.keys(err.keyPattern)[0]提取重复的字段名(可能是email或name) - 从
err.keyValue中获取对应字段的重复值 - 返回
400状态码和友好提示,前端可直接展示给用户 - 其他错误返回通用服务器错误提示,同时保留原始错误信息方便调试
内容的提问来源于stack exchange,提问作者Pranat Karode
相关产品推荐
相关产品推荐

