首页 > 解决方案 > 为什么验证在猫鼬的字段更新上运行?

问题描述

我知道不应该对字段更新进行任何验证,但是当我尝试迁移数据库时它仍然会运行。

部分迁移:

const arr = await User.find({ ban: { $exists: true } });
arr.forEach(async item => {
  // this works
  // await User.updateOne({ _id: item._id }, { ban: false });
  // this doesn't
  item.ban = false;
  await item.save();
});

部分架构:

email: {
  type: String,
  validate: {
    validator: email => User.doesntExist({ email }),
    message: ({ value }) => `Email ${value} has already been taken`
  }
}

“ValidationError:用户验证失败:电子邮件:电子邮件 guest1@ex.com 已被占用”

标签: node.jsmongodbmongoose

解决方案


你做对了,因为正如猫鼬文档中所报告的那样

save() 函数通常是使用 Mongoose 更新文档的正确方法。使用 save(),您可以获得完整的验证和中间件。

但是,当您调用该.save()函数时,会调用所有验证器,包括您的用户电子邮件验证器:

validator: email => User.doesntExist({ email })

在您的情况下,这是一个问题,因为正在验证的用户已经保存在数据库中......因此,为避免这种情况,您需要使用.update()函数来更新您的用户。


推荐阅读