NestJS-根据一个属性有条件地验证正文

时间:2019-01-05 22:47:47

标签: node.js typescript nestjs class-validator class-transformer

我正在尝试找到一种使用DTO(使用出色的class-validatorclass-transformer库)验证实体的好方法。即使是嵌套结构,它也确实能很好地工作,但就我而言,我希望基于某些条件具有body属性。

可能会帮助您理解的示例:

让我们想象我的身体应该总是selectedCategory。 根据该字段,内容可以来自包含prop1的类别1,也可以来自包含prop2的类别2。

我不想为他们两个都使用null,我真的想必须定义prop1或基于prop2的{​​{1}}。

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

我已经建立了一个具有所有常用属性的“基”类,以及从其继承的其他几个类。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您是否尝试过使用groups? 您不必创建多个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;
  }
}

答案 1 :(得分:0)

您是否尝试过 ValidateIf 语句?

您可以对 props1props2 进行多次验证,并在 selectedCategory 相应地为“类别 1”或“类别 2”时应用它们。