MongoDB重复键错误处理中,重复邮箱场景下error.keyValue.name未定义的问题排查
MongoDB重复键错误处理中,重复邮箱场景下error.keyValue.name未定义的问题排查
我完全懂你遇到的这个坑——你的错误处理函数现在是硬盯着name字段来取重复值的,可一旦触发重复约束的是email字段,error.keyValue里根本就没有name这个属性,自然会返回undefined啦!
问题根源
MongoDB抛出的重复键错误(错误码通常是11000)里,keyPattern和keyValue的结构是动态的:
keyPattern是一个对象,它的键就是你设置了唯一约束的字段名(比如重复用户名时是{ name: 1 },重复邮箱时是{ email: 1 })keyValue则对应存储了该字段的重复值(重复用户名时是{ name: "xxx" },重复邮箱时是{ email: "xxx@xx.com" })
你之前只写死了取name字段,所以换邮箱重复就失效了。
修复方案:动态获取重复字段和值
我们可以通过Object.keys()来动态提取keyPattern里的字段名,再用这个字段名去keyValue里拿对应的值,这样不管是name、email还是其他唯一字段,都能正确生成错误消息。
修改后的代码示例:
const dbDuplicateKeyHandler = (error) => { // 先判断是否为MongoDB重复键错误 if (error.code !== 11000) return error; // 动态获取触发重复约束的字段名 const duplicatedField = Object.keys(error.keyPattern)[0]; // 获取对应的重复值 const duplicatedValue = error.keyValue[duplicatedField]; const message = `Duplicated field value: (${duplicatedValue}) Please use another value for ${duplicatedField}.`; return new AppError(400, message); };
补充说明
你提到之前在Postman里测试正常,大概率是因为当时只给name字段加了唯一约束,还没给email加,所以测试场景没覆盖到邮箱重复的情况,现在加了邮箱的唯一约束,问题就暴露出来啦。
备注:内容来源于stack exchange,提问作者Marya
相关产品推荐
相关产品推荐

