javascript — проверка вложенных объектов с использованием класса-валидатора в контроллере nest.js

проверять вложенные объекты, используя class-validator в контроллере nest.js

Я хочу проверить полезную нагрузку тела, используя class-validator в контроллере 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{amp}lt;any{amp}gt; { async transform(value: any, metadata: ArgumentMetadata) { if (value instanceof Object {amp}amp;{amp}amp; 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 {amp}gt; 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 {amp}gt; 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 ={amp}gt; metatype === type); } private isEmpty(value: any) { if (Object.keys(value).length {amp}gt; 0) { return false; } return true; } } 

Этот валидационный канал работает нормально для всех, кроме вложенных объектов. Есть идеи, что я здесь делаю не так? Полезная нагрузка моего тела такова:

 { "data": [{ "id": 1, "type": "a" }] } 
Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector