简体   繁体   English

javascript/打字稿 | 类验证器 | 自定义验证装饰器 | 覆盖 `validator` 方法中的 `validationOptions`

[英]javascript/typescript | class-validator | custom validation decorators | override the `validationOptions` inside the `validator` method

Consider the example provided in section 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;
}

How can I set/override the message string conditionally, inside the validator method?如何在validator方法中有条件地设置/覆盖message字符串? Is this possible?这可能吗?

Found it:找到了:



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
      },
    });
  };
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM