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;
}