Не удается заставить ValidatorPipe работать с nest.js
Текущее поведение
Когда я пытаюсь инициализировать канал проверки для тела запроса, ничего не происходит, если указан недопустимый тип.
Ожидаемое поведение
Когда пользователь указывает значение, которое идет вразрез с типом в моем DTO, я отказываюсь с ошибкой. В этом случае я запрашиваю / тестирую с телом
{ "string": true }
Я ожидаю, что это ошибка, но это не так.
Минимальное воспроизведение проблемы
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;
}