Не удается заставить ValidatorPipe работать с nest.js

Текущее поведение

Когда я пытаюсь инициализировать канал проверки для тела запроса, ничего не происходит, если указан недопустимый тип.

Ожидаемое поведение

Когда пользователь указывает значение, которое идет вразрез с типом в моем DTO, я отказываюсь с ошибкой. В этом случае я запрашиваю / тестирую с телом

{ "string": true }

Я ожидаю, что это ошибка, но это не так.

Минимальное воспроизведение проблемы

Тест DTO

import { IsString } from "class-validator";
export class TestDTO {
  @IsString() public readonly string: string;
}

Тестовый контроллер

@Controller()
export class TestController {
  @Post("/test")
  public testing(@Body(new ValidationPipe()) test: TestDTO): string {
    return test.string;
  }
}

1 ответ

Когда тело содержит логическое значение, серверная часть (nestjs) анализирует его как строку. Существует декоратор для проверки, имеет ли параметр логическое значение в виде строки.

      @IsBooleanString()
myVariable:boolean;

Что можно сделать в вашем случае:

  • Опция 1

Вы можете преобразовать значение вашего тела из логического в числовое.

      From { "string": true } To { "string": 1 }
  • Вариант 2

Вы можете использовать дополнительный декоратор validate , @IsNotIn(values: any[])пример:

      @IsString()
@IsNotIn(["FALSE", "TRUE"])
myVariable: string;
  • Вариант 3

Вы можете создать свой собственный декоратор

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

export function IsNotBoolean(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'IsNotBoolean',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
         if(value.toUpperCase() == 'TRUE' || value.toUpperCase() == 'FALSE'){
          return false
         } else {
          return true
         }
        },
      },
    });
  };
}

В DTO

      import { IsString } from "class-validator";
import { IsNotBoolean } from "the path of your custom validate decorator"

export class TestDTO {
  @IsString({myErrorKey:'My error message'}) 
  @IsNotBoolean({the optional error message object})
  string: string;
}

На контроллере

      public testing(@Body(ValidationPipe) test: TestDTO): string {
    return test.string;
}
Другие вопросы по тегам