NestJS小技巧20-class-validators复杂的示例,使项目中的工作更轻松
by 雪隐 from https://juejin.cn/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'];
// 💡 Types here
export class Movie {
@IsString()
@IsNotEmpty()
name: string;
@IsNotEmpty()
@IsNumber()
yearOfRelease: number;
@IsNotEmpty()
@IsString()
@IsIn(validLanguages)
languages: string[];
@IsNotEmpty()
@IsString()
@IsIn(validGeneres)
genre: string[];
}
export class MoviesList {
@IsArray()
@ArrayNotEmpty()
movies: Movie[];
}
参考
转载自:https://juejin.cn/post/7242140832379125815