#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()
декоратора, но то, что происходит, — это предполагаемый эффект.