Sequelize操作Mysql时使用validate

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

1. 必要性

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

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

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

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

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

  6. 更好的代码可维护性: 使用 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 属性中内置的校验规则:

  1. is:检查字段是否匹配指定的正则表达式。
  2. isEmail:验证字段是否为有效的电子邮件地址。
  3. isURL:验证字段是否为有效的URL。
  4. isIP:验证字段是否为有效的IP地址。
  5. isIPv4:验证字段是否为有效的IPv4地址。
  6. isIPv6:验证字段是否为有效的IPv6地址。
  7. isAlpha:验证字段是否只包含字母字符。
  8. isAlphanumeric:验证字段是否只包含字母和数字字符。
  9. isNumeric:验证字段是否只包含数字。
  10. isInt:验证字段是否为整数。
  11. isFloat:验证字段是否为浮点数。
  12. isDecimal:验证字段是否为十进制数。
  13. isLowercase:验证字段是否为小写字母。
  14. isUppercase:验证字段是否为大写字母。
  15. isNull:验证字段是否为 null
  16. notEmpty:验证字段是否不为空。
  17. len:验证字段的长度是否在指定范围内。
  18. isIn:验证字段的值是否在指定数组中。
  19. notIn:验证字段的值是否不在指定数组中。
  20. isDate:验证字段是否为有效的日期。
  21. isAfter:验证字段的日期是否在指定日期之后。
  22. isBefore:验证字段的日期是否在指定日期之前。
  23. isUUID:验证字段是否为有效的UUID。
  24. isCreditCard:验证字段是否为有效的信用卡号码。
  25. isISBN:验证字段是否为有效的ISBN。
  26. isJSON:验证字段是否为有效的JSON字符串。
  27. isAscii:验证字段是否为ASCII字符。
  28. isFullWidth:验证字段是否包含全角字符。
  29. isHalfWidth:验证字段是否包含半角字符。
  30. isVariableWidth:验证字段是否包含可变宽度字符。

原文链接:https://juejin.cn/post/7333157879862460442 作者:慕仲卿

(0)
上一篇 2024年2月11日 上午10:27
下一篇 2024年2月11日 上午10:37

相关推荐

发表回复

登录后才能评论