数据验证
IBest-ORM 提供了完整的数据验证系统,支持通过装饰器定义验证规则。
内置验证器
@Required - 必填验证
ts
import { Required, Column, Table, PrimaryKey } from '@ibestservices/ibest-orm';
@Table()
class User {
@PrimaryKey()
id?: number;
@Required()
@Column()
name?: string; // 必填字段
}@Length - 长度验证
ts
@Length(2, 20) // 最小2,最大20
@Column()
name?: string;
@Length(6) // 最小6,无上限
@Column()
password?: string;@Range - 范围验证
ts
@Range(0, 150) // 0-150之间
@Column()
age?: number;
@Range(0) // 最小0,无上限
@Column()
score?: number;@Min / @Max - 最小/最大值
ts
@Min(0)
@Column()
price?: number;
@Max(100)
@Column()
discount?: number;@Pattern - 正则验证
ts
@Pattern(/^1[3-9]\d{9}$/) // 手机号格式
@Column()
phone?: string;
@Pattern(/^[a-zA-Z0-9_]+$/) // 只允许字母数字下划线
@Column()
username?: string;@Email - 邮箱验证
ts
@Email()
@Column()
email?: string;执行验证
使用 validate() 函数执行验证:
ts
import { validate } from '@ibestservices/ibest-orm';
const user = new User();
user.name = 'A'; // 太短
user.age = 200; // 超出范围
user.email = 'invalid'; // 无效邮箱
const result = validate(user);
if (!result.valid) {
console.log('验证失败');
result.errors.forEach(error => {
console.log(`字段 ${error.field}: ${error.message}`);
});
} else {
console.log('验证通过');
}验证结果
validate() 返回 ValidationResult 对象:
ts
interface ValidationResult {
valid: boolean;
errors: Array<{
field: string;
message: string;
}>;
}组合验证
可以在同一字段上使用多个验证器:
ts
@Table()
class User {
@PrimaryKey()
id?: number;
@Required()
@Length(2, 50)
@Column()
name?: string;
@Required()
@Range(0, 150)
@Column()
age?: number;
@Required()
@Email()
@Column()
email?: string;
@Length(6, 20)
@Pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/) // 必须包含大小写字母和数字
@Column()
password?: string;
}插入前验证
建议在插入数据前进行验证:
ts
const user = new User();
user.name = '张三';
user.age = 25;
user.email = 'zhangsan@example.com';
const result = validate(user);
if (result.valid) {
orm.insert(user);
} else {
// 处理验证错误
throw new Error(result.errors.map(e => e.message).join('; '));
}清除验证元数据
在测试场景中,可能需要清除验证元数据:
ts
import { clearValidationMetadata } from '@ibestservices/ibest-orm';
// 清除所有验证元数据
clearValidationMetadata();