You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:18:27