класс-валидатор не проверяет массивы

Я не могу заставить работать валидатор классов. Вроде не пользуюсь: все работает так, как будто класс-валидатор не использовал. При отправке запроса с неправильно отформатированным телом у меня нет ошибки проверки, хотя должна.

Мой DTO:

import { IsInt, Min, Max } from 'class-validator';

export class PatchForecastDTO {
  @IsInt()
  @Min(0)
  @Max(9)
  score1: number;

  @IsInt()
  @Min(0)
  @Max(9)
  score2: number;
  gameId: string;
}

Мой контроллер:

@Patch('/:encid/forecasts/updateAll')
async updateForecast(
    @Body() patchForecastDTO: PatchForecastDTO[],
    @Param('encid') encid: string,
    @Query('userId') userId: string
): Promise<ForecastDTO[]> {
  return await this.instanceService.updateForecasts(userId, encid, patchForecastDTO);
}

Мой бутстрап:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(PORT);
  Logger.log(`Application is running on http://localhost:${PORT}`, 'Bootstrap');
}
bootstrap();

Я не могу найти, что случилось. Что я пропустил?


person papillon    schedule 21.01.2020    source источник
comment
Вы должны быть более конкретными в том, что происходит не так! Сообщения об ошибках, поведение и т. Д.   -  person FuzzyTemper    schedule 21.01.2020
comment
@FuzzyTemper готово   -  person papillon    schedule 21.01.2020
comment
Это было полезно для меня stackoverflow.com/questions / 58343262 /   -  person frederj    schedule 21.12.2020


Ответы (2)


На самом деле NestJS не поддерживает стандартную проверку массива. Чтобы проверить массив, он должен быть заключен в объект.

Таким образом, я бы использовал не DTO, соответствующий списку элементов, а DTO, соответствующий объекту, который содержит список элементов:

import { PatchForecastDTO } from './patch.forecast.dto';
import { IsArray, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';

export class PatchForecastsDTO {
    @IsArray()
    @ValidateNested() // perform validation on children too
    @Type(() => PatchForecastDTO) // cast the payload to the correct DTO type
    forecasts: PatchForecastDTO[];
}

И я бы использовал этот DTO в своем контроллере:

@Patch('/:encid/forecasts/updateAll')
async updateForecast(
    @Body() patchForecastsDTO: PatchForecastsDTO,
    @Param('encid') encid: string,
    @Query('userId') userId: string
): Promise<ForecastDTO[]> {
  return await this.instanceService.updateForecasts(userId, encid, patchForecastsDTO);
}
person papillon    schedule 21.01.2020

В текущей версии NestJS (7.6.14) проверка тела запроса, представляющего собой массив JSON, поддерживается с помощью встроенного ParseArrayPipe.

@Post()
createBulk(
  @Body(new ParseArrayPipe({ items: CreateUserDto }))
  createUserDtos: CreateUserDto[],
) {
  return 'This action adds new users';
}

См. официальную документацию или исходный код для получения дополнительной информации.

person thomaux    schedule 15.03.2021