阅读class-validator文档

class-validatorg官方总结文档

允许使用基于 装饰器 和 非装饰器 的验证。在内部使用validator.js执行验证。类验证器可以在 浏览器 和node.js平台 上工作。

1.Usage

创建你的类,并在你想要验证的属性上放置一些验证装饰器:

// 引入 class-validator 库中的验证函数和装饰器
import {
  validate,
  validateOrReject,
  Contains,
  IsInt,
  Length,
  IsEmail,
  IsFQDN,
  IsDate,
  Min,
  Max,
} from 'class-validator';
​
// 定义一个名为 Post 的类,用于演示验证功能
export class Post {
  // 通过装饰器指定 title 属性的验证规则,长度必须在 10 到 20 之间
  @Length(10, 20)
  title: string;
​
  // 通过装饰器指定 text 属性的验证规则,必须包含字符串 'hello'
  @Contains('hello')
  text: string;
​
  // 通过装饰器指定 rating 属性的验证规则,必须是整数,且在 0 到 10 之间
  @IsInt()
  @Min(0)
  @Max(10)
  rating: number;
​
  // 通过装饰器指定 email 属性的验证规则,必须是有效的电子邮件地址
  @IsEmail()
  email: string;
​
  // 通过装饰器指定 site 属性的验证规则,必须是有效的完全限定域名(FQDN)
  @IsFQDN()
  site: string;
​
  // 通过装饰器指定 createDate 属性的验证规则,必须是有效的日期对象
  @IsDate()
  createDate: Date;
}
​
// 创建一个 Post 类的实例
let post = new Post();
post.title = 'Hello'; // 不符合长度规则,不应通过验证
post.text = 'this is a great post about hell world'; // 不包含 'hello',不应通过验证
post.rating = 11; // 超出范围,不应通过验证
post.email = 'google.com'; // 不是有效的电子邮件地址,不应通过验证
post.site = 'googlecom'; // 不是有效的完全限定域名,不应通过验证
​
// 使用 validate 函数异步验证 post 对象,返回一个包含验证错误的数组
validate(post).then(errors => {
  // 如果存在验证错误,则输出错误信息
  if (errors.length > 0) {
    console.log('validation failed. errors: ', errors);
  } else {
    // 没有验证错误,输出验证成功信息
    console.log('validation succeed');
  }
});
​
// 使用 validateOrReject 函数异步验证 post 对象,返回一个 Promise
validateOrReject(post).catch(errors => {
  // 如果存在验证错误,则输出错误信息
  console.log('Promise rejected (validation failed). Errors: ', errors);
});
​
// 或者使用 async/await 语法进行异步验证,并捕获验证错误
async function validateOrRejectExample(input) {
  try {
    await validateOrReject(input);
  } catch (errors) {
    console.log('Caught promise rejection (validation failed). Errors: ', errors);
  }
}
​

2.通过选择

validate函数可选地 期望一个 ValidatorOptions对象 作为 第二个参数

// 定义了用于配置验证器行为的接口 ValidatorOptions
export interface ValidatorOptions {
  // 是否跳过缺失的属性,默认为 false
  skipMissingProperties?: boolean;
​
  // 是否启用白名单过滤,默认为 false
  whitelist?: boolean;
​
  // 是否禁止非白名单属性,默认为 false
  forbidNonWhitelisted?: boolean;
​
  // 可以指定要应用的验证组
  groups?: string[];
​
  // 是否忽略默认消息,默认为 false
  dismissDefaultMessages?: boolean;
​
  // 验证错误的配置
  validationError?: {
    // 是否在验证错误时返回目标对象,默认为 true
    target?: boolean;
    
    // 是否在验证错误时返回值,默认为 true
    value?: boolean;
  };
​
  // 是否禁止未知的值,默认为 false
  forbidUnknownValues?: boolean;
​
  // 是否在遇到第一个错误时停止验证,默认为 false
  stopAtFirstError?: boolean;
}
​

注意事项forbidUnknownValues默认为true,建议保持默认值。将其设置为false将导致未知对象通过验证!

3.Validation errors

validate方法返回一个ValidationError对象数组。每个ValidationError是:

// 表示验证失败时的错误信息对象
{
  // 未通过验证的目标对象
  target: Object;
​
  // 未通过验证的目标对象的属性名
  property: string;
​
  // 未通过验证的属性值
  value: any;
​
  // 包含验证失败的具体约束及错误消息
  constraints?: {
    [type: string]: string;
  };
​
  // 包含目标属性的所有嵌套验证错误信息
  children?: ValidationError[];
}
​

在本例中,当我们验证Post对象时,我们有这样一个ValidationError对象数组:

// 表示验证过程中发生的错误的数组
[{
    // 未通过验证的目标对象
    target: /* post object */,
​
    // 未通过验证的目标对象的属性名
    property: "title",
​
    // 未通过验证的属性值
    value: "Hello",
​
    // 包含验证失败的具体约束及错误消息
    constraints: {
        length: "$property must be longer than or equal to 10 characters"
    }
}, {
    // 未通过验证的目标对象
    target: /* post object */,
​
    // 未通过验证的目标对象的属性名
    property: "text",
​
    // 未通过验证的属性值
    value: "this is a great post about hell world",
​
    // 包含验证失败的具体约束及错误消息
    constraints: {
        contains: "text must contain a hello string"
    }
},
// and other errors
]
​

如果你不想在验证错误中暴露目标,在使用验证器时有一个特殊的选项:

validator.validate(post, { validationError: { target: false } });

当您通过http发送错误时,这尤其有用,并且您很可能不想公开整个目标对象。

Validation messages

您可以在装饰器选项中指定验证消息,该消息将在validate方法返回的ValidationError中返回(在此字段验证失败的情况下)。

import { MinLength, MaxLength } from 'class-validator';
​
export class Post {
  @MinLength(10, {
    message: 'Title is too short',
  })
  @MaxLength(50, {
    message: 'Title is too long',
  })
  title: string;
}

你可以在你的消息中使用一些特殊的令牌:

$value—正在验证的值

$property -要验证的对象属性的名称

$target -要验证的对象的类名

$constraint1, $constraint2,…$constraintN -由特定验证类型定义的约束

Example of usage:

// 引入 class-validator 库中的 MinLength 和 MaxLength 装饰器
import { MinLength, MaxLength } from 'class-validator';
​
// 定义了一个名为 Post 的类
export class Post {
  // 使用 MinLength 装饰器来指定 title 属性的最小长度为 10
  @MinLength(10, {
    // 在验证失败时,可以使用 message 属性自定义错误消息
    // 这里的 $constraint1 将被替换为 "10",$value 将被替换为实际提供的值
    message: 'Title is too short. Minimal length is $constraint1 characters, but actual is $value',
  })
  // 使用 MaxLength 装饰器来指定 title 属性的最大长度为 50
  @MaxLength(50, {
    // 在验证失败时,可以使用 message 属性自定义错误消息
    // 这里的 $constraint1 将被替换为 "50",$value 将被替换为实际提供的值
    message: 'Title is too long. Maximal length is $constraint1 characters, but actual is $value',
  })
  // 定义了一个名为 title 的字符串属性
  title: string;
}
​

您还可以提供一个返回消息的函数。这允许你创建更细粒度的消息:

// 引入 class-validator 库中的 MinLength、MaxLength 和 ValidationArguments 类
import { MinLength, ValidationArguments } from 'class-validator';
​
// 定义了一个名为 Post 的类
export class Post {
  // 使用 MinLength 装饰器来指定 title 属性的最小长度为 10
  @MinLength(10, {
    // 通过 message 属性传递一个函数,该函数在验证失败时会被调用
    message: (args: ValidationArguments) => {
      // 使用 ValidationArguments 对象中的 value 属性获取实际提供的值
      if (args.value.length === 1) {
        // 当实际值的长度为 1 时返回的错误消息
        return 'Too short, minimum length is 1 character';
      } else {
        // 当实际值的长度大于 1 时返回的错误消息,使用 args.constraints[0] 获取指定的最小长度
        return 'Too short, minimum length is ' + args.constraints[0] + ' characters';
      }
    },
  })
  // 定义了一个名为 title 的字符串属性
  title: string;
}
​

Message函数接受ValidationArguments,其中包含以下信息:

值—正在验证的值

约束——由特定验证类型定义的约束数组

targetName -要验证的对象的类名

对象-正在验证的对象

属性-要验证的对象属性的名称

Validating arrays

如果你的字段是一个数组,并且你想对数组中的每一项执行验证,你必须指定一个特殊的each: true装饰器选项。

// 引入 class-validator 库中的 MaxLength 装饰器
import { MaxLength } from 'class-validator';
​
// 定义了一个名为 Post 的类
export class Post {
  // 使用 MaxLength 装饰器来限制 tags 属性中每个元素的最大长度为 20
  @MaxLength(20, {
    // 设置 each 选项为 true,表示要对数组中的每个元素分别进行长度验证
    each: true,
  })
  // 定义了一个名为 tags 的字符串数组属性
  tags: string[];
}
​

这将验证邮件中的每个项目。标记数组。

Validating sets

如果你的字段是一个集合,并且你想对集合中的每个项执行验证,你必须指定一个特殊的each: true装饰器选项:

import { MinLength, MaxLength } from 'class-validator';
​
export class Post {
  @MaxLength(20, {
    each: true,
  })
  tags: Set<string>;
}

这将验证邮件中的每个项目。标记集。

Validating maps

如果你的字段是一个映射,并且你想要对映射中的每个项执行验证,你必须指定一个特殊的each: true装饰器选项:

// 引入 class-validator 库中的 MaxLength 装饰器
import { MaxLength } from 'class-validator';
​
// 定义了一个名为 Post 的类
export class Post {
  // 使用 MaxLength 装饰器来限制 tags 属性中每个键和值的字符串的最大长度为 20
  @MaxLength(20, {
    // 设置 each 选项为 true,表示要对 Map 中的每个键和值的字符串分别进行长度验证
    each: true,
  })
  // 定义了一个名为 tags 的 Map 属性,键和值都是字符串类型
  tags: Map<string, string>;
}

Validating nested objects

如果你的对象包含嵌套的对象,并且你想让验证器也执行它们的验证,那么你需要使用@ validatenest()装饰器:

// 引入 class-validator 库中的 ValidateNested 装饰器
import { ValidateNested } from 'class-validator';
​
// 引入 User 类,假设它是另一个定义好的类
import { User } from './User';
​
// 定义了一个名为 Post 的类
export class Post {
  // 使用 ValidateNested 装饰器来指示对 user 属性进行嵌套验证
  @ValidateNested()
  // 定义了一个名为 user 的属性,类型为 User,假设 User 是另一个类的实例
  user: User;
}
​

请注意,嵌套对象必须是一个类的实例,否则@ validatenest将不知道哪个类是验证的目标。另请检查验证普通对象。它也适用于多维数组,如:

import { ValidateNested } from 'class-validator';
​
export class Plan2D {
  @ValidateNested()
  matrix: Point[][];
}

Validating promises

如果你的对象包含带有承诺返回值的属性,那么你需要使用@ValidatePromise()装饰器:

// 引入 class-validator 库中的 ValidatePromise 和 Min 装饰器
import { ValidatePromise, Min } from 'class-validator';
​
// 定义了一个名为 Post 的类
export class Post {
  // 使用 Min 装饰器 来指示 userId 属性的最小值为 0
  @Min(0)
  // 使用 ValidatePromise 装饰器来指示 userId 属性是一个 Promise<number> 类型,并需要进行异步验证
  @ValidatePromise()
  // 定义了一个名为 userId 的属性,类型为 Promise<number>
  userId: Promise<number>;
}

它也可以很好地使用@ validatenest装饰器:

// 引入 class-validator 库中的 ValidateNested 和 ValidatePromise 装饰器
import { ValidateNested, ValidatePromise } from 'class-validator';
​
// 引入 User 类,假设它是另一个定义好的类
import { User } from './User';
​
// 定义了一个名为 Post 的类
export class Post {
  // 使用 ValidateNested 装饰器来指示对 user 属性进行嵌套验证
  @ValidateNested()
  // 使用 ValidatePromise 装饰器来指示 user 属性是一个 Promise<User> 类型,并需要进行异步验证
  @ValidatePromise()
  // 定义了一个名为 user 的属性,类型为 Promise<User>
  user: Promise<User>;
}

Inheriting Validation decorators(继承验证装饰器)

当你定义了一个继承自另一个子类的子类时,这个子类将自动继承父类的装饰器。如果一个属性在子类中被重新定义,类装饰器将从它自己的类和基类中应用于它。

Conditional validation

当提供的条件函数返回false时,可以使用条件验证装饰器(@ValidateIf)忽略属性上的验证器。条件函数接受被验证的对象,并且必须返回一个布尔值。

Whitelisting

即使您的对象是验证类的实例,它也可以包含未定义的附加属性。如果你不想在你的对象上有这样的属性,传递特殊的标志来验证方法:

将上下文传递给装饰器

可以将自定义对象传递给decorator,如果验证失败,可以在属性的ValidationError实例上访问该对象。

Validation decorators
1.Common validation decorators
DecoratorDescription
Common validation decorators
@IsDefined(value: any)检查value是否定义(!)==未定义,!== null)。这是唯一忽略skipMissingProperties选项的装饰器。
@IsOptional()检查给定的值是否为空(=== null, === undefined),如果是,则忽略该属性上的所有验证器。
@Equals(comparison: any)检查value是否等于("===")比较。
@NotEquals(comparison: any)检查value是否不等于("!==")比较。
@IsEmpty()检查给定值是否为空(=== ",=== null, === undefined)。
@IsNotEmpty()检查给定的值是否不为空(!== ", !== null, !== undefined)。
@IsIn(values: any[])检查value是否在允许的值数组中。
@IsNotIn(values: any[])检查value是否不在不允许的值数组中。

1

2.Type validation decorators
@IsBoolean()Checks if a value is a boolean.
`@IsDate()Checks if the value is a date.
@IsString()Checks if the value is a string.
@IsNumber(options: IsNumberOptions)Checks if the value is a number.
@IsInt()Checks if the value is an integer number.
@IsArray()Checks if the value is an array
@IsEnum(entity: object)Checks if the value is a valid enum

3.Number validation decorators
Number validation decoratorsdeco
@IsDivisibleBy(num: number)检查值是否能被另一个数整除
@IsPositive()检查值是否为大于零的正数
@IsNegative()检查值是否为小于零的负数
@Min(min: number)检查给定的数字是否大于或等于给定的数字。
@Max(max: number)检查给定的数字是否小于或等于给定的数字。

4.Date validation decorators

deco
@MinDate(date: Date|(() => Date))检查值是否为在指定日期之后的日期。
@MaxDate(date: Date|(() => Date))检查值是否为在指定日期之前的日期。

5.String-type validation decorators

String-type validation decorators
@IsBooleanString()检查字符串是否为布尔值(例如是“true”或“false”或“1”,“0”)。
@IsDateString()@IsISO8601的别名
@IsNumberString(options?: IsNumericOptions)检查字符串是否为数字。

6.String validation decorators

String validation decorators
@Contains(seed: string)检查字符串是否包含种子
@NotContains(seed: string)检查字符串是否不包含种子。
@IsAlpha()检查字符串是否只包含字母(a-zA-Z)。
@IsAlphanumeric()检查字符串是否只包含字母和数字。
@IsDecimal(options?: IsDecimalOptions)检查字符串是否是有效的十进制值。默认的IsDecimalOptions是force_decimal=False, decimal_digits: '1,', locale: 'en-US'
@IsAscii()检查字符串是否只包含ASCII字符。
@IsBase32()检查字符串是否为base32编码。
@IsBase58()检查字符串是否为base58编码。
@IsBase64(options?: IsBase64Options)检查字符串是否为base64编码。
@IsIBAN()检查字符串是否为IBAN(国际银行帐号)。
@IsBIC()检查字符串是否为BIC(银行识别码)或SWIFT代码。
@IsByteLength(min: number, max?: number)检查字符串的长度(以字节为单位)是否在一个范围内。
@IsCreditCard()检查字符串是否为信用卡。
@IsCurrency(options?: IsCurrencyOptions)检查字符串是否是有效的货币金额。
@IsISO4217CurrencyCode()检查字符串是否为ISO 4217货币代码。
@IsEthereumAddress()使用基本正则表达式检查字符串是否为以太坊地址。不验证地址校验和。
@IsBtcAddress()检查字符串是否是有效的BTC地址。
@IsDataURI()检查字符串是否为数据uri格式。
@IsEmail(options?: IsEmailOptions)检查字符串是否为电子邮件。
@IsFQDN(options?: IsFQDNOptions)检查字符串是否是一个完全限定的域名(例如domain.com)。
@IsFullWidth()检查字符串是否包含任何全宽字符。
@IsHalfWidth()检查字符串是否包含任何半宽字符。
@IsVariableWidth()检查字符串是否包含全宽和半宽字符的混合。
@IsHexColor()检查字符串是否为十六进制颜色。
@IsHSL()检查字符串是否是基于CSS颜色级别4规范的HSL颜色。
@IsRgbColor(options?: IsRgbOptions)检查字符串的颜色是rgb还是rgba。
@IsIdentityCard(locale?: string)检查字符串是否为有效的身份证代码。
@IsPassportNumber(countryCode?: string)检查字符串是否为相对于特定国家代码的有效护照号码。
@IsPostalCode(locale?: string)检查字符串是否为邮政编码。
@IsHexadecimal()检查字符串是否为十六进制数。
@IsOctal()检查字符串是否是八进制数。
@IsMACAddress(options?: IsMACAddressOptions)检查字符串是否为MAC地址。
@IsIP(version?: "4"|"6")检查字符串是否为IP(版本4或6)。
@IsPort()检查字符串是否为有效端口号。
@IsISBN(version?: "10"|"13")检查字符串是否为ISBN(版本10或13)。
@IsEAN()检查字符串是否为EAN(欧洲商品编号)。
@IsISIN()检查字符串是否为ISIN(股票/安全标识符)。
@IsISO8601(options?: IsISO8601Options)检查字符串是否是有效的ISO 8601日期格式。使用strict = true选项对有效日期进行额外检查。
@IsJSON()检查字符串是否是有效的JSON。
@IsJWT()检查字符串是否是有效的JWT。
@IsObject()检查对象是否有效对象(null,函数,数组将返回false)。
@IsNotEmptyObject()检查对象是否为空。
@IsLowercase()检查字符串是否为小写。
@IsLatLong()检查字符串是否为lat, long格式的有效经纬度坐标。
@IsLatitude()检查字符串或数字是否是有效的纬度坐标。
@IsLongitude()检查字符串或数字是否是有效的经度坐标。
@IsMobilePhone(locale: string)检查字符串是否为手机号码。
@IsISO31661Alpha2()检查字符串是否是有效的ISO 3166-1 alpha-2官方指定的国家代码。
@IsISO31661Alpha3()检查字符串是否是有效的ISO 3166-1 alpha-3官方指定的国家代码。
@IsLocale()检查字符串是否为区域设置。
@IsPhoneNumber(region: string)使用libphonenumber-js检查字符串是否是一个有效的电话号码。
@IsMongoId()检查字符串是否是MongoDB ObjectId的有效十六进制编码表示。
@IsMultibyte()检查字符串是否包含一个或多个多字节字符。
@IsNumberString(options?: IsNumericOptions)检查字符串是否为数字。
@IsSurrogatePair()检查字符串是否包含代理对字符。
@IsTaxId()检查字符串是否是有效的税号。默认区域设置是en-US。
@IsUrl(options?: IsURLOptions)检查字符串是否为URL。
@IsMagnetURI()检查字符串是否为磁铁uri格式。
@IsUUID(version?: UUIDVersion)检查字符串是否为UUID(版本3、4、5或全部)。
@IsFirebasePushId()检查字符串是否是Firebase推送ID
@IsUppercase()检查字符串是否为大写。
@Length(min: number, max?: number)检查字符串的长度是否在某个范围内。
@MinLength(min: number)检查字符串的长度是否不小于给定的数字。
@MaxLength(max: number)检查字符串的长度是否不超过给定的数字。
@Matches(pattern: RegExp, modifiers?: string)检查字符串是否与模式匹配。匹配(“foo”/ foo / i)或匹配(“foo”、“foo”,“我”)。
@IsMilitaryTime()检查字符串是否是HH:MM格式的军事时间的有效表示形式。
@IsTimeZone()检查字符串是否代表一个有效的IANA时区。
@IsHash(algorithm: string)检查字符串是否为哈希。支持如下类型:md4、md5、sha1、sha256、sha384、sha512、ripemd128、ripemd160、tiger128、tiger160、tiger192、crc32、crc32b。
@IsMimeType()检查字符串是否与有效的MIME类型格式匹配
@IsSemVer()检查字符串是否是语义版本控制规范(SemVer)。
@IsISSN(options?: IsISSNOptions)检查字符串是否为ISSN。
@IsISRC()Checks if the string is a ISRC.
@IsRFC3339()Checks if the string is a valid RFC 3339 date.
@IsStrongPassword(options?: IsStrongPasswordOptions)Checks if the string is a strong password.

4.Array validation decorators
Array validation decorators
@ArrayContains(values: any[])检查array是否包含给定值数组中的所有值。
@ArrayNotContains(values: any[])检查数组是否不包含任何给定的值。
@ArrayNotEmpty()检查给定的数组是否为空。
@ArrayMinSize(min: number)检查数组的长度是否大于或等于指定的数字。
@ArrayMaxSize(max: number)检查数组的长度是否小于或等于指定的数字。
@ArrayUnique(identifier?: (o) => any)检查所有数组的值是否唯一。对象的比较是基于引用的。可选函数可以指定用于比较的返回值。

5.Object validation decorators

Object validation decorators
@IsInstance(value: any)检查属性是否是传递值的实例。

6.Other decorators

Other decorators
@Allow()当没有为该属性指定其他约束时,防止剥离该属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值