NestJS - Проверка тела условно, на основе одного свойства
Я пытаюсь найти хороший способ проверить тело с помощью DTO (используя блестящий class-validator
а также class-transformer
библиотеки). Это работает очень хорошо, даже для вложенных структур, но в моем случае я бы хотел, чтобы свойство body основывалось на некоторых условиях.
Пример, который, вероятно, поможет понять:
Давайте представим, что мое тело всегда должно иметь selectedCategory
, Исходя из этого поля, содержимое может быть из категории 1, которая содержит prop1
ИЛИ из категории 2, которая содержит prop2
,
Я не хочу допустить нулевое значение для них обоих, я действительно хочу иметь либо prop1
определяется или prop2
на основе selectedCategory
,
Я думаю, что я мог бы использовать канал, но тогда как я могу указать правильный DTO для использования?
Я создал "базовый" класс со всеми общими свойствами и несколькими другими классами, которые наследуются от него.
Я мог бы создать экземпляр трубы вручную на основе свойства selectedCategory
это было бы идеально, но я понятия не имею, что передать в качестве второго аргумента канала (метаданных).
Спасибо за вашу помощь.
2 ответа
Вы пробовали использовать группы? Вместо нескольких DTO, вы просто создаете один DTO. Каждое свойство присваивается одной или нескольким группам:
@Min(12, {groups: ['registration', 'update']})
age: number;
@Length(2, 20, {groups: ['registration']})
name: string;
Затем вы можете условно передать группы преобразователю / валидатору класса:
@Injectable()
export class ConditionalValidationPipe implements PipeTransform {
async transform(entity: any, metadata: ArgumentMetadata) {
// Dynamically determine the groups
const groups = [];
if (entity.selectedCategory === 1) {
groups.push('registration');
}
// Transform to class with groups
const entityClass = plainToClass(EntityDto, entity, { groups })
// Validate with groups
const errors = await validate(entityClass, { groups });
if (errors.length > 0) {
throw this.createError(errors);
}
return entityClass;
}
}
Вы пробовали инструкцию ValidateIf ?
У вас может быть несколько проверок для
props1
или же
props2
и применять их, если
selectedCategory
соответственно "категория 1" или "категория 2".