Sequelize 是一个 Node.js 的 ORM 框架,提供了许多方便的数据库操作功能。在使用 Sequelize 进行数据库操作时,数据的验证是一个非常重要的环节。本文将为大家详细介绍 Sequelize 中的数据验证流程,包括数据类型、长度、格式等多个方面,以及如何自定义验证规则。
数据类型验证
在 Sequelize 中,我们可以设置每个字段的数据类型,包括字符串、整数、浮点数、日期等等。这些数据类型不仅可以用于数据库的创建和修改,也可以用于数据的验证。
例如,我们创建一个 User 模型:
// www.javascriptcn.com code example
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'sqlite',
storage: './database.sqlite',
});
const User = sequelize.define('User', {
username: {
type: DataTypes.STRING,
allowNull: false,
},
age: {
type: DataTypes.INTEGER,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
},
});在上面的代码中,我们定义了一个 User 模型,包含了 username、age、email 三个字段,分别是字符串、整数、字符串类型。其中,我们设置了 allowNull: false,表示这些字段不允许为空。这样,当我们创建或修改一条数据时,如果这些字段为空,Sequelize 就会抛出一个 ValidationError 错误。
数据长度验证
除了数据类型之外,我们还可以设置每个字段的长度。例如,我们可以设置 username 字段的最大长度为 20:
// www.javascriptcn.com code example
const User = sequelize.define('User', {
username: {
type: DataTypes.STRING(20),
allowNull: false,
},
age: {
type: DataTypes.INTEGER,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
},
});在上面的代码中,我们使用了 DataTypes.STRING(20) 来设置 username 字段的最大长度为 20。这样,当我们创建或修改一条数据时,如果 username 字段的长度超过了 20,Sequelize 就会抛出一个 ValidationError 错误。
数据格式验证
除了数据类型和数据长度之外,我们还可以设置每个字段的格式。例如,我们可以设置 email 字段的格式必须符合邮箱格式:
// www.javascriptcn.com code example
const User = sequelize.define('User', {
username: {
type: DataTypes.STRING,
allowNull: false,
},
age: {
type: DataTypes.INTEGER,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
validate: {
isEmail: true,
},
},
});在上面的代码中,我们使用了 validate.isEmail 来设置 email 字段必须符合邮箱格式。如果 email 字段不符合邮箱格式,Sequelize 就会抛出一个 ValidationError 错误。
自定义验证规则
除了 Sequelize 提供的验证规则之外,我们还可以自定义验证规则。例如,我们可以设置 username 字段必须是字母和数字的组合:
// www.javascriptcn.com code example
const User = sequelize.define('User', {
username: {
type: DataTypes.STRING,
allowNull: false,
validate: {
isAlphanumeric: true,
customValidator(value) {
if (!/^[a-zA-Z0-9]+$/.test(value)) {
throw new Error('Username must be alphanumeric');
}
},
},
},
age: {
type: DataTypes.INTEGER,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
validate: {
isEmail: true,
},
},
});在上面的代码中,我们使用了 validate.customValidator 来设置 username 字段必须是字母和数字的组合。如果 username 字段不符合要求,Sequelize 就会抛出一个 ValidationError 错误。
数据验证流程
在使用 Sequelize 进行数据操作时,数据验证流程如下:
- 首先,Sequelize 会根据模型定义中的数据类型、长度、格式等规则对数据进行验证。
- 如果数据验证通过,则会执行数据操作(例如创建、修改、删除等)。
- 如果数据验证不通过,则会抛出一个 ValidationError 错误。
因此,我们应该在进行数据操作之前,先对数据进行验证,以避免数据不符合规则而导致错误的发生。
示例代码
下面是一个完整的示例代码,包含了数据的创建、修改、删除等操作,并对数据进行了验证:
// www.javascriptcn.com code example
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'sqlite',
storage: './database.sqlite',
});
const User = sequelize.define('User', {
username: {
type: DataTypes.STRING,
allowNull: false,
validate: {
isAlphanumeric: true,
customValidator(value) {
if (!/^[a-zA-Z0-9]+$/.test(value)) {
throw new Error('Username must be alphanumeric');
}
},
},
},
age: {
type: DataTypes.INTEGER,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
validate: {
isEmail: true,
},
},
});
(async () => {
await sequelize.sync({ force: true });
try {
// 创建一条数据
await User.create({
username: 'test123',
age: 20,
email: 'test123@example.com',
});
// 创建一条数据,但 username 字段不符合要求
await User.create({
username: 'test!@#',
age: 20,
email: 'test456@example.com',
});
} catch (error) {
console.error(error.message);
}
try {
// 修改一条数据
const user = await User.findOne({ where: { username: 'test123' } });
user.age = 30;
await user.save();
// 修改一条数据,但 email 字段不符合要求
user.email = 'test456';
await user.save();
} catch (error) {
console.error(error.message);
}
try {
// 删除一条数据
const user = await User.findOne({ where: { username: 'test123' } });
await user.destroy();
} catch (error) {
console.error(error.message);
}
})();在上面的代码中,我们先创建了一个 User 模型,包含了 username、age、email 三个字段,并对它们进行了数据验证。然后,我们使用 Sequelize 进行了数据的创建、修改、删除等操作,并对数据进行了验证。如果数据验证不通过,就会抛出一个 ValidationError 错误。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cc48ffe46428fe9e56d764