passwordConfirm设为required:true时更新MongoDB用户信息验证错误如何解决
问题根本原因
- 用户创建成功后,你的
pre('save')钩子会将passwordConfirm设为undefined,所以该字段实际不会被存储到数据库中。 - 后续调用
save()方法更新用户信息时,Mongoose默认会校验所有标记了required: true的字段,检测到passwordConfirm无值就会抛出必填验证错误。 - 原配置的
passwordConfirm必填规则本身不符合业务逻辑:它只应该在用户注册、修改密码的场景下生效,而非所有文档保存场景都要求必填。
解决办法
方案1(最推荐):动态设置passwordConfirm的必填校验规则
修改用户模型中passwordConfirm的required属性为函数判断,仅当文档是新创建、或者密码字段被修改时才要求必填,完全贴合业务逻辑:
passwordConfirm: { type: String, // 动态判断是否需要必填 required: [ function() { return this.isNew || this.isModified('password') }, 'Please confirm your password' ], validate: { validator: function (el) { return el === this.password; }, message: 'Passwords are not the same!', }, }
同时需要补全更新控制器中修改密码场景的passwordConfirm赋值逻辑,否则修改密码时会触发验证失败:
if (req.body.password) { user.password = req.body.password; // 新增这行,接收前端提交的确认密码 user.passwordConfirm = req.body.passwordConfirm; }
方案2:更新时仅校验修改过的字段
如果不想修改模型定义,也可以在调用save()时添加validateModifiedOnly: true参数,让Mongoose只校验本次被修改的字段,未修改的字段不会触发验证规则:
const updatedUser = await user.save({ validateModifiedOnly: true });
内容的提问来源于stack exchange,提问作者valkkorn
相关产品推荐
相关产品推荐

