簡體   English   中英

在 nest.js 控制器中使用類驗證器驗證嵌套對象

[英]validate nested objects using class-validator in nest.js controller

我想在 nest.js 控制器中使用類驗證器驗證正文有效負載。 我的currency.dto.ts文件是這樣的:

 import { IsNotEmpty, IsString, ValidateNested, IsNumber, IsDefined, } from 'class-validator'; class Data { @IsNotEmpty() @IsString() type: string; @IsNotEmpty() @IsNumber() id: number; } export class CurrencyDTO { @ValidateNested({ each: true }) @IsDefined() data: Data[]; }

在我的 nest.js 控制器中,我像這樣使用它。

 @Post() @UseGuards(new AuthTokenGuard()) @UsePipes(new ValidationPipe()) addNewCurrency(@Req() req, @Body() data: CurrencyDTO) { console.log('data', data); }

我的驗證管道類是這樣的:

 import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException, HttpException, HttpStatus, } from '@nestjs/common'; import { validate, IsInstance } from 'class-validator'; import { plainToClass, Exclude } from 'class-transformer'; @Injectable() export class ValidationPipe implements PipeTransform<any> { async transform(value: any, metadata: ArgumentMetadata) { if (value instanceof Object && this.isEmpty(value)) { throw new HttpException( `Validation failed: No Body provided`, HttpStatus.BAD_REQUEST, ); } const { metatype } = metadata; if (!metatype || !this.toValidate(metatype)) { return value; } const object = plainToClass(metatype, value); const errorsList = await validate(object); if (errorsList.length > 0) { const errors = []; for (const error of errorsList) { const errorsObject = error.constraints; const { isNotEmpty } = errorsObject; if (isNotEmpty) { const parameter = isNotEmpty.split(' ')[0]; errors.push({ title: `The ${parameter} parameter is required.`, parameter: `${parameter}`, }); } } if (errors.length > 0) { throw new HttpException({ errors }, HttpStatus.BAD_REQUEST); } } return value; } private toValidate(metatype): boolean { const types = [String, Boolean, Number, Array, Object]; return !types.find(type => metatype === type); } private isEmpty(value: any) { if (Object.keys(value).length > 0) { return false; } return true; } }

此驗證管道適用於除嵌套對象之外的所有對象。 知道我在這里做錯了什么嗎? 我的身體有效載荷是這樣的:

{
"data": [{
    "id": 1,
    "type": "a"
}]
}

嘗試使用@Type指定嵌套類型:

import { Type } from 'class-transformer';

export class CurrencyDTO {
  @ValidateNested({ each: true })
  @Type(() => Data)
  data: Data[];
}

對於要驗證的嵌套類型,它必須是類的實例,而不僅僅是普通數據對象。 使用@Type裝飾器,您可以告訴class-transformer在plainToClass中調用VaildationPipe時為給定屬性實例化一個類。

如果您使用內置的ValidationPipe確保已設置選項transform: true

至少在我的情況下,接受的答案需要更多信息。 照原樣,如果請求中不存在關鍵data ,則不會運行驗證。 要獲得完整驗證,請嘗試:

@IsDefined()
@IsNotEmptyObject()
@ValidateNested()
@Type(() => CreateOrganizationDto)
@ApiProperty()
organization: CreateOrganizationDto;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM