Skip to content

DTO 验证规则

常用的

IsNumberString

字符串"1",可以符合条件 但是数字 1 不行

注意

message 错误的提示 语言 要这么传入 @IsNumberString({},{message: '....'})

  • 示例
ts
import { IsNumberString } from "class-validator";
export class LoginDto {
  @IsNumberString({}, { message: "用户名必须是数字字符串" })
  username: string;
}

IsBooleanString

字符串'ture','false' 可以符合条件 但是 true,false 不行

  • 示例
ts
import { IsBooleanString } from "class-validator";
export class LoginDto {
  @IsBooleanString({ message: "用户名必须是布尔字符串" })
  username: string;
}

IsDateString

日期字符串 '2024-11-27' 可以符合条件 但是 2024-11-27 不行

  • 示例
ts
import { IsDateString } from "class-validator";
export class LoginDto {
  @IsDateString({}, { message: "数据必须是日期" })
  username: string;
}

字符串类型

Contains

  • 传入的字符串包含制定的字符串么

@Contains('test'),包含 test 通过。不包含,抛出异常。

message 为第二个入参数。

ts
import { Contains } from "class-validator";
export class LoginDto {
  @Contains("test", { message: "数据必须包含test" })
  username: string;
}

NotContains

与上面相反

IsUppercase

是否都大写

IsLowercase

是否都小写

IsMobilePhone

是否手机号

你需要这样使用 @IsMobilePhone('zh-cn'),看懂了吗,需要传一个 locate。

  • 示例
ts
import { Contains, IsMobilePhone } from "class-validator";
export class LoginDto {
  @IsMobilePhone("zh-CN", {}, { message: "请输入正确的手机号" })
  username: string;
}

Length

检验字符串长度的。注意一下跟 int 的不同

  • 示例
ts
import { Length } from "class-validator";
export class LoginDto {
  @Length(4, 12, { message: "长度在4-12之间" })
  username: string;
}

MaxLength & MinLength

  • 示例
ts
import { MaxLength, MinLength } from "class-validator";
export class LoginDto {
  @MinLength(4, { message: "最短4位" })
  @MaxLength(12, { message: "最长12位" })
  username: string;
}

Matches

使用时,第一个参数是一个正则,符合该正则通过。

  • 示例
ts
import { Matches } from "class-validator";
export class LoginDto {
  @Matches(/test/gi, { message: "用户名格式不正确" })
  username: string;
}

IsString

验证是否是字符串

  • 示例
ts
import { IsString } from "class-validator";
export class LoginDto {
  @IsString({ message: "用户名格式不正确" })
  username: string;
}

Number 类型

IsInt

是否是整数

  • 示例
ts
import { IsInt } from "class-validator";
export class LoginDto {
  @IsInt({ message: "用户名格式不正确" })
  username: number;
}

IsDivisibleBy

是否是某个数的倍数

  • 示例
ts
import { IsDivisibleBy } from "class-validator";
export class LoginDto {
  @IsDivisibleBy(3, { message: "能否被3整除" })
  username: number;
}

IsPositive

是否是正数

  • 示例
ts
import { IsPositive } from "class-validator";
export class LoginDto {
  @IsPositive({ message: "是否是正数" })
  username: string;
}

IsNegative

是否是负数

ts
import { IsNegative } from "class-validator";
export class LoginDto {
  @IsNegative({ message: "是否是负数" })
  username: string;
}

Max&Min

字符串用 MaxLength&MinLength

数字用 Max&Min

最大最小值

  • 示例
ts
import { Max, Min } from "class-validator";
export class LoginDto {
  @Min(4, { message: "最小4" })
  @Max(12, { message: "最大12" })
  username: string;
}

类型判断的装饰器

IsString

是 string 类型

IsNumber

是 number 类型

IsInt

是 Int 类型

IsArray

是数组类型

IsBoolean

是布尔类型

IsNotEmptyObject

不是空对象

常用校验器

IsDefined

不能等于 null 或者 undefined

但是空字符串可以

Equals

等于某个确定的值

NotEquals

不等于某个确定的值

IsEmpty

检查这个值是否等于'',undefined

IsNotEmpty

检查这个值是否不等于'',undefined

IsIn

是否在某个数组中

bash
@IsIn(['1','2'])

IsNotIn

是否不在某个数组中

bash
@IsNotIn(['1','2'])

校验数组

如果需要校验数组中的每一项。需要传入一个 each: true

比如期望输入的一个数组,每一个元素应该是一个小于 10 的 number,

bash

@IsNumber({},{each: true,})
@Max(20,{each: true})

自定义验证装饰器

实际工作是避免不了自定义验证方法的。

显然在当前的环境中,最好的方式就是定义一个 验证装饰器。

ts
import {
  registerDecorator,
  ValidationOptions,
  ValidationArguments,
} from "class-validator";

export function IsLongerThan(
  property: string,
  validationOptions?: ValidationOptions
) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: "isLongerThan",
      target: object.constructor,
      propertyName: propertyName,
      constraints: [property],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
          const [relatedPropertyName] = args.constraints;
          const relatedValue = (args.object as any)[relatedPropertyName];
          return (
            typeof value === "string" &&
            typeof relatedValue === "string" &&
            value.length > relatedValue.length
          ); // you can return a Promise<boolean> here as well, if you want to make async validation
        },
      },
    });
  };
}
  • 这里我自己写了个验证多个空字符串
ts
import {
  registerDecorator,
  ValidationOptions,
  ValidationArguments,
} from "class-validator";

export function CustomNotEmpty(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: "CustomNotEmpty",
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
          if (typeof value === "string") {
            if (value.trim()) {
              return true;
            } else {
              return false;
            }
          } else {
            return true;
          }
        },
        // 不传message找的就是默认的
        defaultMessage: (args: ValidationArguments) => {
          return `${args.property} 不能为空777`;
        },
      },
    });
  };
}
  • 使用这样配套 IsNotEmpty 使用 可以杜绝类似 ' '存在
ts
import { IsNotEmpty } from "class-validator";

import { CustomNotEmpty } from "./customdto";
export class LoginDto {
  @CustomNotEmpty({ message: "用户名不能为空" })
  @IsNotEmpty({ message: "用户名不能为空" })
  username: String;
}