Sequelize:在验证之前从模型数据中删除字段

时间:2018-03-20 12:49:06

标签: sequelize.js

我有一种情况,我正在使用PII混淆。例如,从服务获取信息时,SSN值将被混淆为'*********'。现在我需要处理一种情况,即前端可能会更新其他信息并将混淆的SSN发送给我。在这种情况下,我想确保我不保存混淆版本。

我有一些工作代码,但我通常不喜欢依赖modelInstance.dataValues所以我想知道是否有不同/更好/更惯用的方式来完成这项工作:

Member.beforeValidate((member, options) => {
  const ssnRegex = /[0-9]{3}-?[0-9]{2}-?[0-9]{4}/gi;

  // Before we validate model info, we want to remove any
  // obfuscated values.
  if (member.ssn && !ssnRegex.test(member.ssn)) {
    delete member.dataValues.ssn;
  }
});

我确实尝试delete member.ssn,但是没有飞,我在文档中看不到modelInstance.remove()(或类似的)方法。

1 个答案:

答案 0 :(得分:0)

正如您所怀疑的那样,没有instance.remove方法或等效方法,我同意操纵模型实例感觉不对。 Sequelize处理这种情况的方法是在更新期间传入一个fields数组。这告诉Sequelize只更新数组中传递的字段:

const fields = ['name'];

if (!ssnIsObfuscated()) {
  fields.push('ssn');
}

memberInstance
  .update(req.body, {fields})
  .then(() => {
    // do something
  });

作为预防措施,您还可以在validate字段中添加ssn方法。只有在创建或更新中包含ssn时才会触发:

ssn: {
  type: Sequelize.STRING,
  validate: {
    isObfuscated(value) {
      if (ssnIsObfuscated()) {
        throw new Error('No good');
      }
    }
  }
}