【问题标题】:nestjs ValidatorConstraint in order, reflect custom validator to swagger definitionnestjs ValidatorConstraint 按顺序,将自定义验证器反映到 swagger 定义
【发布时间】:2020-09-09 17:01:39
【问题描述】:

在nestjs中,为了验证startDate和endDate的查询参数

1、sartDate必须在endDate之前,这里是自定义验证器

@ValidatorConstraint({ name: 'isBefore', async: false })
export class IsBeforeConstraint implements ValidatorConstraintInterface {
  validate(propertyValue: string, args: ValidationArguments) {
    console.log('check is before ');

    if (args.object[args.constraints[0]]) {
      return moment(propertyValue) < moment(args.object[args.constraints[0]]);
    } else {
      return true;
    }
  }

  defaultMessage(args: ValidationArguments) {
    return `"${args.property}" must be before "${args.constraints[0]}"`;
  }
}

2、startDate和endDate必须以'YYYY-MM-DD'格式传入

@ValidatorConstraint({ name: 'isRightDateFormat', async: false })
export class DateFormatConstraint implements ValidatorConstraintInterface {
  validate(propertyValue: string) {
    console.log('check format ' + propertyValue);

    return moment(propertyValue, 'YYYY-MM-DD', true).isValid();
  }

  defaultMessage(args: ValidationArguments) {
    return `"${args.property}" must be with format YYYY-MM-DD`;
  }
}

所以对于 startDate,我想先验证格式,然后验证 isBefoer 而不是 endDate,我无法控制验证顺序作为我的以下代码:

export class HistoricalQueryDTO {
  @IsNotEmpty()
  @ApiProperty()
  @Validate(DateFormatConstraint)
  @Validate(IsBeforeConstraint, ['endDate'])
  startDate: string;

  @IsNotEmpty()
  @ApiProperty()
  endDate: string;
}

另外,如何通过 Annotation 将 costome 验证器应用于 swagger 定义? 仅将必需的验证添加到 swagger

【问题讨论】:

    标签: nestjs class-validator


    【解决方案1】:

    您可以设置描述和模式or any other Swagger Schema Property,但无法使用类验证器装饰器来更新您的 swagger 文件。他们出于不同的原因设置不同的元数据

    【讨论】:

    • 我们可以控制验证顺序吗?如果 startDate 没有有效格式,我不想验证“startDate 应该在 endDate 之前”
    • 我相信这实际上是使用多个同名装饰器的问题。使用多个 @Validate() decoraotrs 意味着最后一个运行(代码最下方的一个)将是运行的验证。装饰器只设置元数据,类验证器类读取该元数据并使用它。通过使用两个相同的装饰器,第二个装饰器基本上覆盖了第一个装饰器的元数据。
    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 2022-07-25
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    相关资源
    最近更新 更多