9

我正在尝试找到一种使用 DTO 验证身体的好方法(使用辉煌class-validatorclass-transformer图书馆)。它工作得非常好,即使对于嵌套结构,但在我的情况下,我想拥有基于某些条件的 body 属性。

可能有助于理解的示例:

让我们想象一下我的身体应该一直有selectedCategory。基于该字段,内容可能来自类别 1,其中包含prop1或来自类别 2,其中包含prop2.

我不想让他们两个都为 null,我真的希望必须prop1定义或prop2基于selectedCategory.

我认为我可以使用管道,但是如何指定要使用的正确 DTO?

我已经建立了一个“基”类,它包含所有的公共属性和几个从它继承的其他类。

我可以根据 property 手动实例化管道selectedCategory,这是理想的,但我不知道要传递什么作为管道的第二个参数(元数据)。

谢谢你的帮助。

4

2 回答 2

12

您是否尝试过使用群组?您只需创建一个 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;
  }
}
于 2019-01-05T23:18:48.150 回答
4

您是否尝试过ValidateIf语句?

如果是“类别 1”或“类别 2”,您可以对props1or进行多个验证props2并应用它们。selectedCategory

于 2021-06-05T18:49:08.890 回答