Класс NestJS DTO устанавливает порядок выполнения класса-валидатора и класса-трансформатора

#typescript #nestjs #decorator #class-validator #class-transformer

Вопрос:

Есть ли способ установить порядок выполнения декораторов при описании класса DTO в NestJS с использованием class-validator и class-transformer пакетов?

Следующий код завершается ошибкой, если значение foo равно null с ошибкой:

Ожидал строку, но получил значение null

 @IsOptional()
@IsString()
@IsByteLength(1, 2048)
@Transform(({ value }) => validator.trim(value))
@Transform(({ value }) => validator.stripLow(value))
foo: string;
 

Даже если у меня есть isString декоратор, который должен проверить, действительно ли строка была передана и уже должна не пройти, чтобы не передать выполнение @Transform декораторам, но это не удалось.

Ответ №1:

Валидатор классов работает на основе классов. Запросы полезной нагрузки, поступающие на сервер, являются для начала обычными объектами JSON. Чтобы изменить это поведение, Nest должен сначала позвонить plainToClass , class-validator если вы используете его ValidationPipe . Из-за этого @Transform() декораторы имеют приоритет над другими декораторами-валидаторами классов, и на них действуют в первую очередь. Вы могли бы обойти это, используя несколько каналов или, возможно, предоставляя значения по умолчанию для @Transform() декоратора, но то, что происходит, — это предполагаемый эффект.