热搜:前端 nest neovim nvim

NestJS小技巧20-class-validators复杂的示例,使项目中的工作更轻松

lxf2023-06-14 03:01:02
by 雪隐 from https:///user/1433418895994094
本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可联系授权

原文链接

我们需要编写类验证器来验证输入参数、API请求正文和查询参数。

在某些情况下,类验证器是非常典型的,并且没有找到任何文档,如果你想执行一些复杂的验证,让我分享一些例子

验证手机号码阵列

export class SendBulkMessageBody {
  @IsArray()
  @ArrayMinSize(1)
  @ArrayMaxSize(5000)
  @Matches('^1[2|3|4|5|6|7|8|9][0-9]d{8}$', undefined, { each: true })
  mobile_numbers: string[];
}

Input [“abc”, “8789”], error:  “each value in mobile_numbers must match ^1[2|3|4|5|6|7|8|9][0-9]\d{8}$ regular expression”

验证对象数组

"buttons": [
{
    "index":"1",
    "button_type":"type1",
    "Button_text": "Click"
}
export classes WhatsAppButtonsParam {
  @IsNumber()
  index: number;
  
  @IsString()
  @IsEnum(ButtonType, {each: true})
  button_type: string;
  
  @IsString()
  button_text string;
}

export class CreateTemplateValidator {
  @IsOptional()
  @IsArray()
  @ValidateNested({each:true})
  buttons: WhatsAppButtonsParam[];
}

让我们深入了解类验证器-

1.验证字符串

任意字符串

// example.dto.ts
import { IsString, IsNotEmpty, MinLength, MaxLength } from 'class-validator';

export class AnyString {
  @IsString()
  @IsNotEmpty()
  @MinLength(3)
  @MaxLength(65)
  userName: string;
}

特定字符串

// example.dto.tsty
import { ArrayNotEmpty, IsArray, IsIn } from 'class-validator';

const weekdays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'];
export class SpecificString {
  @IsArray()
  @ArrayNotEmpty()
  @IsIn(weekdays)
  day: string[];
}

字符串数组

// example.dto.ts
import {
  ArrayNotEmpty,
  Contains,
  IsArray,
  IsString,
  Matches,
  MaxLength,
} from 'class-validator';

export class StringArray {
  @IsArray()
  @ArrayNotEmpty()
  // 验证数组的每一个项目是不是字符串类型
  @IsString({ each: true })
  // 当您想验证每一个项目的时候,输入`each: true`
  // 验证每一个项目是否超过最大长度
  @MaxLength(6, { each: true })
  // 验证每一个项目是否只包含英文字母
  @Matches('^[a-zA-Z\\s]+$', undefined, { each: true })
  // 验证每一个项目是否包含特定的文本
  @Contains('hello', { each: true })
  stringArray: string[];
}

具有自定义前缀的字符串数组

// example.dto.ts
import {
  ArrayNotEmpty,
  IsArray,
  Validate,
  ValidateNested,
  ValidatorConstraint,
  ValidatorConstraintInterface,
} from 'class-validator';

@ValidatorConstraint({ name: 'arrayPrefixValidator' })
export class ArrayPrefixValidator implements ValidatorConstraintInterface {
  validate(values: string[] = []): boolean {
    if (values.length) {
      return values.every((value) => value.startsWith('str-'));
    }
    return false;
  }
}
export class StringArray {
  @IsArray()
  @ArrayNotEmpty()
  // 验证每一个项目是否包含前缀`str-`
  @Validate(ArrayPrefixValidator, { message: 'No str- prefix' })
  stringArray: string[];
}

验证数字

任意数字

import { IsNumber, IsNotEmpty, MinLength, MaxLength } from 'class-validator';
export class AnyString {
  @IsNumber()
  @IsNotEmpty()
  @MinLength(3)
  @MaxLength(65)
  userName: string;
}

特定数字

import {
  IsNumber,
  IsNotEmpty,
  MinLength,
  Validate,
  ValidatorConstraint,
  ValidatorConstraintInterface,
} from 'class-validator';
@ValidatorConstraint({ name: 'isDividedBy17' })
export class IsDividedBy17 implements ValidatorConstraintInterface {
  validate(value: number): boolean {
    if (value) {
      return value % 17 === 0;
    }
    return false;
  }
}
export class SpecificNumber {
  @IsNumber()
  @IsNotEmpty()
  // 验证数字是否能被17整除
  @Validate(IsDividedBy17, { message: 'No divided by 17' })
  specificNumber: number;
}

数字数组

import {
  IsNumber,
  IsNotEmpty,
  Validate,
  MaxLength,
  ValidatorConstraint,
  ValidatorConstraintInterface,
} from 'class-validator';

@ValidatorConstraint({ name: 'isEvenNumber' })
export class IsEvenNumber implements ValidatorConstraintInterface {
  validate(numbers: number[]): boolean {
    if (numbers) {
      return numbers.every((number) => number % 2 === 0);
    }
    return false;
  }
}
export class SpecificNumber {
  @IsNumber()
  @IsNotEmpty()
  // 验证每一个项目是否是偶数
  @Validate(IsEvenNumber, { message: 'Not even' })
  numbersList: number[];
}

3. 自定义对象

假设我们有一个payload:

{
  jsommovies: [
    {
      name: 'The jurassic park',
      yearOfRelease: 1999,
      languages: ['en'],
      gener: ['sci-fi', 'thriller'],
    },
    {
      name: 'The Croods',
      yearOfRelease: 2012,
      languages: ['en', 'fr', 'es'],
      gener: ['animation', 'kids'],
    },
  ],
};
import {
  IsNumber,
  IsNotEmpty,
  IsString,
  IsIn,
  IsArray,
  ArrayNotEmpty,
  ValidatorConstraint,
  ValidatorConstraintInterface,
} from 'class-validator';

@ValidatorConstraint({ name: 'isEvenNumber' })
export class IsEvenNumber implements ValidatorConstraintInterface {
  validate(numbers: number[]): boolean {
    if (numbers) {
      return numbers.every((number) => number % 2 === 0);
    }
    return false;
  }
}
const validLanguages = ['en', 'es', 'fr'];
const validGeneres = ['sci-fi', 'thriller', 'animation', 'horror', 'vintage'];
//