javascript - Sequelize 自定义验证 - 无法访问实体中的所有字段
问题描述
我试图用一些自定义验证逻辑在 sequelize 中创建一个模型(比如有 3 个属性,attrA、B 和 C)。本教程帮助我完成了大部分设置:
const Model = Sequelize.define('model', {
attrA: { type: Sequelize.STRING },
attrB: { type: Sequelize.STRING },
attrC: { type: Sequelize.STRING },
}, {
validate: {
someValidationLogic() {
// Do something with attrA,B,C
// if (this.attrA ... this.attrB ... this.attrC) throw new Error..
}
}
})
然而,在应用程序逻辑中,只需要更新 3 个属性(A 和 B)中的 2 个:
Model.update(
{
attrA: 'foo',
attrB: 'bar'
}, {
where: {
id: 1,
},
returning: true,
})
这导致在调用自定义验证逻辑时,在this
函数中访问的对象中,只有attrA
和attrB
定义在 中this
,而 attrC 保持未定义。这会导致验证逻辑失败,因为 attrC 无法读取。有什么方法可以让对象可见someValidationLogic()
以填充所有属性?或者这个“验证”根本不应该是验证逻辑,应该在应用程序级别完成?
解决方案
您的验证逻辑可以考虑attrC
未定义的可能性:
validate: {
someValidationLogic() {
if (this.attrA !== 'undefined' && this.attrA === 'forbidden value' ) {
// throw new Error
}
}
}
但是,如果您的验证包括根据当前数据库值检查提供的值,那么您最好在应用程序层处理此问题:首先恢复当前数据库记录,根据需要对其进行操作,然后将其保存到数据库中。
推荐阅读
- android - 如何在 Retrofit 2 中使用 GitHub API 创建存储库?
- android - 片段上的Settext指针异常
- php - PHP DateTime modify() 不适用于时间
- medium.com - 用于更新帖子/文章的中型 API
- c# - 广播接收器在 Android 10 中不起作用
- r - R ShinyTest GitHub Actions 在 Windows 上失败,但在 Mac 和 Ubuntu 上通过
- c++ - 如何构造makefile来编译和运行二进制文件?
- flutter - 从 Flutter 中另一个独立 StreamProvider 的响应更新依赖的 ChangeNotifierProvider
- java - Eclipse Maven Rest Api:错误:无法将 UserNotFoundException 解析为类型。如何解决这个问题?
- java - 如何在java中生成四个数字的唯一随机序列