如何使用 sequelize 验证节点应用程序中的业务规则?

how to validate business rules in node application with sequelize?

我有一个使用 sequelize orm 的 express/node js 应用程序。我想知道在应用程序中什么是编写业务规则验证的最佳位置。假设我有一个用户模型 class 如下。我在 class(下面以粗体显示)中添加了一些模型验证,例如名称不能为空。除了模型验证之外,我可以在哪里添加一些业务规则验证,比如如果年龄小于 18 岁或 16 岁,则不能有 employerName 或 hoursWorkedPerWeek(这仅适用于此示例)。例子是为这个问题设计的。

有没有办法将此类规则添加到模型 class,如果现在如何将其添加到下面的控制器 class。

用户模型class

const User = sequelize.define(
  'User',
  {
    id: {
      type: DataTypes.BIGINT,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'id'
    },
    Name: { 
        type: DataTypes.STRING,  
        allowNull: false,
        **validate: {
          notEmpty: true
        }**
     },
    age: {
    }, 
    hoursWorkedPerWeek: {
    }, 
    employerName: {
    }, 
    createdAt: {
     
    },
    updatedAt: {
    
    }
  }
  ....
);

控制器class

static async add(user) {
      try {
             models.User.create(user).then(newUser => {
                 //do something
        }).catch(error => {
          throw error;
        }); 
    
      } catch (error) { 
          throw error;
      }
    }

在文档中,您似乎可以在模型定义中传递验证规则:https://sequelize.org/master/manual/validations-and-constraints.html#per-attribute-validations。请注意您可以在最后执行的自定义验证程序。

如果您正在进行大量验证,将其放在一个文件中并在整个项目中根据需要引用可能会有所帮助。

编辑:更新以显示示例。提醒一下,我还没有实现这个,但是从文档来看,这似乎是遵循的。

// validations.js

exports.ageValidator = value => {
    if(value < 18) {
        throw new Error("Invalid age.");
    }
}

// list other validators as needed here in the same manner

然后您可以将其导入模型所在的 class 并添加到验证块中。

// within your User model
const validateModule = require(/* path to validations.js */);
const ageValidator = validateModule.ageValidator;

/*
    Add ageValidator to the `validate` section

    age:{
        validate: {
            customValidate(value) {
                ageValidator(value);
            }
        }
    }