Sequelize操作Mysql时使用validate

2024年 2月 11日 85.9k 0

在 Sequelize 中使用 validate 校验的主要目的是确保数据的完整性和一致性。本文首先介绍使用validate的必要性并在此基础之上列举了几个常见的典型场景最后列举了validate的内置规则及其作用。

1. 必要性

  • 数据完整性: 校验可以确保数据满足预期的格式和约束,防止无效或不良数据进入数据库。这有助于维护数据库中的数据完整性。

  • 数据一致性: 通过定义校验规则,可以确保数据库中的数据保持一致性。例如,对于一个表示电子邮件地址的字段,通过校验规则可以防止存储无效的电子邮件地址。

  • 提高系统安全性: 校验有助于防止恶意输入或不当输入的攻击。通过限制输入的范围和格式,可以减少安全风险。

  • 减少错误和异常: 校验可以捕获并阻止不符合预期的数据输入,从而减少系统中的错误和异常。这有助于提高应用程序的稳定性和可靠性。

  • 简化代码逻辑: 将数据验证放在模型定义中,可以在应用程序的不同部分共享相同的验证规则,避免重复的验证逻辑。

  • 更好的代码可维护性: 使用 validate 校验将验证逻辑集中在模型中,使得更改验证规则更加方便和可维护。这样可以确保所有对模型的操作都遵循相同的验证规则。

  • 2. 典型的使用场景

    示例1: 验证用户名长度

    设置模型的代码

    const User = sequelize.define('User', {
      username: {
        type: Sequelize.STRING,
        allowNull: false,
        validate: {
          len: {
            args: [3, 20],
            msg: 'Username must be between 3 and 20 characters long.',
          },
        },
      },
    });
    

    在这个例子中,通过 validate 属性,设置了一个验证规则,要求 username 的长度在3到20个字符之间。

    使用模型的代码

    // 示例代码
    // ...
    
    // 尝试创建一个用户名过长的用户
    try {
      const newUser = await User.create({ username: 'toolongusernameforvalidation' });
    } catch (error) {
      console.error(error.message); // 输出错误信息
    }
    

    示例2: 验证邮箱格式

    设置模型的代码

    const User = sequelize.define('User', {
      email: {
        type: Sequelize.STRING,
        allowNull: false,
        validate: {
          isEmail: {
            msg: 'Invalid email format.',
          },
        },
      },
    });
    

    在这个例子中,通过 validate 属性,使用内置的 isEmail 验证规则,要求 email 必须符合邮箱格式。

    使用模型的代码

    // 示例代码
    // ...
    
    // 尝试创建一个格式不正确的邮箱用户
    try {
      const newUser = await User.create({ email: 'invalidemail@com' });
    } catch (error) {
      console.error(error.message); // 输出错误信息
    }
    

    示例3: 验证密码强度

    设置模型的代码

    const User = sequelize.define('User', {
      password: {
        type: Sequelize.STRING,
        allowNull: false,
        validate: {
          isStrongPassword: {
            msg: 'Password must be at least 8 characters long and include uppercase, lowercase, and special characters.',
          },
        },
      },
    });
    

    在这个例子中,通过 validate 属性,使用自定义的 isStrongPassword 验证规则,要求 password 必须包含大写、小写字母和特殊字符,并且长度至少为8个字符。

    使用模型的代码

    // 示例代码
    // ...
    
    // 尝试创建一个弱密码的用户
    try {
      const newUser = await User.create({ password: 'weakpass' });
    } catch (error) {
      console.error(error.message); // 输出错误信息
    }
    

    示例4: 验证日期范围

    设置模型的代码

    const Event = sequelize.define('Event', {
      startDate: {
        type: Sequelize.DATE,
        allowNull: false,
        validate: {
          isAfter: {
            args: new Date().toISOString(),
            msg: 'Event start date must be in the future.',
          },
        },
      },
    });
    

    在这个例子中,通过 validate 属性,使用内置的 isAfter 验证规则,要求 startDate 必须在当前日期之后。

    使用模型的代码

    // 示例代码
    // ...
    
    // 尝试创建一个过去的事件
    try {
      const newEvent = await Event.create({ startDate: '2022-01-01' });
    } catch (error) {
      console.error(error.message); // 输出错误信息
    }
    

    示例5: 验证唯一性

    设置模型的代码

    const Product = sequelize.define('Product', {
      name: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: {
          args: true,
          msg: 'Product name must be unique.',
        },
      },
    });
    

    在这个例子中,通过 validate 属性,使用内置的 unique 验证规则,要求 name 必须是唯一的。

    使用模型的代码

    // 示例代码
    // ...
    
    // 尝试创建两个同名的产品
    try {
      const product1 = await Product.create({ name: 'Example Product' });
      const product2 = await Product.create({ name: 'Example Product' }); // 这里会触发唯一性验证
    } catch (error) {
      console.error(error.message); // 输出错误信息
    }
    

    3. 常见内置规则

    下面是一些常见的在 Sequelize 的 validate 属性中内置的校验规则:

  • is:检查字段是否匹配指定的正则表达式。
  • isEmail:验证字段是否为有效的电子邮件地址。
  • isURL:验证字段是否为有效的URL。
  • isIP:验证字段是否为有效的IP地址。
  • isIPv4:验证字段是否为有效的IPv4地址。
  • isIPv6:验证字段是否为有效的IPv6地址。
  • isAlpha:验证字段是否只包含字母字符。
  • isAlphanumeric:验证字段是否只包含字母和数字字符。
  • isNumeric:验证字段是否只包含数字。
  • isInt:验证字段是否为整数。
  • isFloat:验证字段是否为浮点数。
  • isDecimal:验证字段是否为十进制数。
  • isLowercase:验证字段是否为小写字母。
  • isUppercase:验证字段是否为大写字母。
  • isNull:验证字段是否为 null
  • notEmpty:验证字段是否不为空。
  • len:验证字段的长度是否在指定范围内。
  • isIn:验证字段的值是否在指定数组中。
  • notIn:验证字段的值是否不在指定数组中。
  • isDate:验证字段是否为有效的日期。
  • isAfter:验证字段的日期是否在指定日期之后。
  • isBefore:验证字段的日期是否在指定日期之前。
  • isUUID:验证字段是否为有效的UUID。
  • isCreditCard:验证字段是否为有效的信用卡号码。
  • isISBN:验证字段是否为有效的ISBN。
  • isJSON:验证字段是否为有效的JSON字符串。
  • isAscii:验证字段是否为ASCII字符。
  • isFullWidth:验证字段是否包含全角字符。
  • isHalfWidth:验证字段是否包含半角字符。
  • isVariableWidth:验证字段是否包含可变宽度字符。
  • 相关文章

    Oracle如何使用授予和撤销权限的语法和示例
    Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
    下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
    社区版oceanbase安装
    Oracle 导出CSV工具-sqluldr2
    ETL数据集成丨快速将MySQL数据迁移至Doris数据库

    发布评论