NestJS - Проверка тела условно, на основе одного свойства - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь найти хороший способ проверки тела с помощью DTO (используя блестящие библиотеки class-validator и class-transformer). Это работает очень хорошо, даже для вложенных структур, но в моем случае я бы хотел, чтобы свойство body основывалось на некоторых условиях.

Пример, который, вероятно, поможет понять:

Давайте представим, что мое тело всегда должно иметь selectedCategory. Исходя из этого поля, содержимое может быть из категории 1, которая содержит prop1 ИЛИ из категории 2, которая содержит prop2.

Я не хочу разрешать нулевое значение для них обоих, я действительно хочу, чтобы было определено prop1 или prop2 на основе selectedCategory.

Я думаю, что я мог бы использовать канал, но тогда как я могу указать правильный DTO для использования?

Я создал «базовый» класс со всеми общими свойствами и несколькими другими классами, которые наследуют его.

Я мог бы создать экземпляр канала вручную, основываясь на свойстве selectedCategory, это было бы идеально, но я понятия не имею, что передать в качестве второго аргумента канала (метаданные).

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 06 января 2019

Вы пробовали использовать группы ? Вместо нескольких 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;
  }
}
...