序列化自定义验证-无法访问实体中的所有字段

时间:2018-12-22 20:55:43

标签: javascript sql database validation sequelize.js

我尝试使用一些自定义验证逻辑以序列化(例如,具有3个属性attrA,B和C)创建模型。 This tutorial帮助我进行了大部分设置:

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
        integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
        crossorigin="anonymous"></script>

但是,在应用程序逻辑中,只需说,需要更新3个属性(A和B)中的2个:

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..
    }
  }
})

这导致在调用自定义验证逻辑时,在函数中访问的Model.update( { attrA: 'foo', attrB: 'bar' }, { where: { id: 1, }, returning: true, }) 对象中,this中仅定义了attrAattrB,并且attrC仍然不确定。这会导致验证逻辑失败,因为无法读取attrC。有什么方法可以使我从this中看到该对象以填充所有属性?还是该“验证”根本不应该是验证逻辑,应该在应用程序级别完成?

1 个答案:

答案 0 :(得分:0)

您的验证逻辑可以考虑未定义attrC的可能性:

validate: {
    someValidationLogic() {
        if (this.attrA !== 'undefined' && this.attrA === 'forbidden value' ) {
            // throw new Error
        }     
    }
}

但是,如果您的验证包括对照当前数据库值检查提供的值,那么您最好在应用程序层中进行处理:首先恢复当前数据库记录,根据需要进行操作,然后将其保存到数据库中。