Проверяйте вложенные объекты, используя валидатор класса и nestjs - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь проверить вложенные объекты, используя class-validator и NestJS.Я уже пытался следовать этому потоку , используя @Type декоратор из преобразования классов, и мне не повезло.Вот что у меня есть:

DTO:

class PositionDto {
  @IsNumber()
  cost: number;

  @IsNumber()
  quantity: number;
}

export class FreeAgentsCreateEventDto {

  @IsNumber()
  eventId: number;

  @IsEnum(FinderGamesSkillLevel)
  skillLevel: FinderGamesSkillLevel;

  @ValidateNested({ each: true })
  @Type(() => PositionDto)
  positions: PositionDto[];

}

Я также использую встроенный канал проверки nestjs, это мой загрузчик:

async function bootstrap() {
  const app = await NestFactory.create(ServerModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(config.PORT);
}
bootstrap();

Работает нормально для других свойств, массив объектов - единственный, который не работает.

1 Ответ

0 голосов
/ 15 декабря 2018

Вы ожидаете, что positions: [1] выдаст 400, но вместо этого он принят.

Согласно этой проблеме Github , это похоже на ошибку в классе-валидаторе.Если вы передадите примитивный тип (boolean, string, number, ...) или array вместо объекта, он примет входные данные как допустимые, хотя и не должен.


Я не вижу никакого стандартного обходного пути, кроме создания настраиваемого декоратора проверки правильности :

import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

export function IsNonPrimitiveArray(validationOptions?: ValidationOptions) {
  return (object: any, propertyName: string) => {
    registerDecorator({
      name: 'IsNonPrimitiveArray',
      target: object.constructor,
      propertyName,
      constraints: [],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
          return Array.isArray(value) && value.reduce((a, b) => a && typeof b === 'object' && !Array.isArray(b), true);
        },
      },
    });
  };
}

и последующего использования в вашем классе dto:

@ValidateNested({ each: true })
@IsNonPrimitiveArray()
@Type(() => PositionDto)
positions: PositionDto[];
...