Skip to content

数据验证

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();