【问题标题】:javascript/typescript | class-validator | custom validation decorators | override the `validationOptions` inside the `validator` methodjavascript/打字稿 |类验证器 |自定义验证装饰器 |覆盖 `validator` 方法中的 `validationOptions`
【发布时间】:2021-07-31 19:07:40
【问题描述】:

考虑Custom validation decorators 部分中提供的示例:

// Decorator definition


import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

export function IsLongerThan(property: string, validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'isLongerThan',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [property],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
          const [relatedPropertyName] = args.constraints;
          const relatedValue = (args.object as any)[relatedPropertyName];
          return typeof value === 'string' && typeof relatedValue === 'string' && value.length > relatedValue.length; // you can return a Promise<boolean> here as well, if you want to make async validation
        },
      },
    });
  };
}
// Decorator usage


import { IsLongerThan } from './IsLongerThan';

export class Post {
  title: string;

  @IsLongerThan('title', {
    /* you can also use additional validation options, like "groups" in your custom validation decorators. "each" is not supported */
    message: 'Text must be longer than the title',
  })
  text: string;
}

如何在validator 方法内有条件地设置/覆盖message 字符串?这可能吗?

【问题讨论】:

    标签: javascript node.js typescript class-validator


    【解决方案1】:

    找到了:

    
    
    export function IsLongerThan(property: string, validationOptions?: ValidationOptions) {
      return function (object: Object, propertyName: string) {
    
        let message;
    
        const validate = function (value: any, args: ValidationArguments) {
          // Set message based on some validation logic
          // message = ...
        }
    
        const defaultMessage = function () {
          return message;
        }
    
        registerDecorator({
          name: 'isLongerThan',
          target: object.constructor,
          propertyName: propertyName,
          constraints: [property],
          options: validationOptions,
          validator: {
            validate,
            defaultMessage
          },
        });
      };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2020-01-02
      • 1970-01-01
      • 2018-06-21
      • 2015-09-18
      相关资源
      最近更新 更多