node.js - 为什么验证在猫鼬的字段更新上运行?
问题描述
我知道不应该对字段更新进行任何验证,但是当我尝试迁移数据库时它仍然会运行。
部分迁移:
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 已被占用”
解决方案
你做对了,因为正如猫鼬文档中所报告的那样:
save() 函数通常是使用 Mongoose 更新文档的正确方法。使用 save(),您可以获得完整的验证和中间件。
但是,当您调用该.save()
函数时,会调用所有验证器,包括您的用户电子邮件验证器:
validator: email => User.doesntExist({ email })
在您的情况下,这是一个问题,因为正在验证的用户已经保存在数据库中......因此,为避免这种情况,您需要使用.update()函数来更新您的用户。
推荐阅读
- reactjs - 如何在firestore中按时间戳正确过滤
- android - React Native Webview Google 登录(Android)错误:无法登录此浏览器或应用程序可能不安全
- django - Django localhost 返回 ok 但 curl localhost 返回 404 错误
- json - 嵌套表单无法连接输入?
- android - 此项目与您的设备不兼容,我在几乎所有设备中都收到此错误
- javascript - CSP,拒绝加载脚本,违反了以下内容安全策略指令:“script-src 'self'”
- java - 如何按值传递 JavaFX observableList?
- swift - 更改 TabView 选项卡时如何运行函数
- eclipse - 在 Eclipse 中创建新的 JavaFX 项目时,如何修复“构建”期间发生的内部错误?
- javascript - 如何上传文件并获取公共 url Google Drive Api?