Sequelize操作Mysql时使用validate

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

1. 必要性

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

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

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

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

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

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

2. 典型的使用场景

示例1: 验证用户名长度

设置模型的代码

javascript 复制代码
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个字符之间。

使用模型的代码

javascript 复制代码
// 示例代码
// ...

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

示例2: 验证邮箱格式

设置模型的代码

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

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

使用模型的代码

javascript 复制代码
// 示例代码
// ...

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

示例3: 验证密码强度

设置模型的代码

javascript 复制代码
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个字符。

使用模型的代码

javascript 复制代码
// 示例代码
// ...

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

示例4: 验证日期范围

设置模型的代码

javascript 复制代码
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 必须在当前日期之后。

使用模型的代码

javascript 复制代码
// 示例代码
// ...

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

示例5: 验证唯一性

设置模型的代码

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

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

使用模型的代码

javascript 复制代码
// 示例代码
// ...

// 尝试创建两个同名的产品
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:验证字段是否包含可变宽度字符。
相关推荐
张一根1 小时前
ESP32+Mqtt+Node.js+Vue3 做工控界面
node.js
要开心吖ZSH2 小时前
处方物流信息同步优化:从 36 秒到亚秒级的踩坑记录
java·数据库·mysql·性能优化
yoothey3 小时前
MySQL 数据库连接池调优实战
数据库·mysql
Tian_Hang4 小时前
Eclipse Mosquitto 安装及介绍
java·运维·服务器·ide·sql·mysql·eclipse
TE-茶叶蛋6 小时前
Node.js-Phase 1 学习总结:CLI 文件管理系统
学习·node.js
前端之虎陈随易14 小时前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·vue.js·人工智能·typescript·node.js
南墙上的石头16 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
执子手 吹散苍茫茫烟波18 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql
峥无21 小时前
深入理解MySQL事务与MVCC机制
数据库·mysql
要开心吖ZSH1 天前
MVCC 进阶:快照读 vs 当前读、幻读与 Next-Key Lock
java·数据库·sql·mysql·mvcc