我可以使用 class-validator 指定执行验证装饰器的顺序吗?

yal*_*man 9 validation typescript class-validator

假设有一个类 ,Post需要验证。

export class Post {
  @IsArray()
  tags: string[];
}
Run Code Online (Sandbox Code Playgroud)

现在假设他想确保“错误”一词永远不会出现在该tags字段中。他编写了一个自定义验证装饰器来执行此操作:

export function NoMistakes (validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'noMistakes',
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      validator: {
        validate (tags: any, args: ValidationArguments) {
          tags.forEach(tag => {
            if (tag == 'mistake') {
              return false;
            }
          });

          return true;
        }
      }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,他改写Post如下:

export class Post {
  @IsArray()
  @NoMistakes()
  tags: string[];
}
Run Code Online (Sandbox Code Playgroud)

例如,当标签类型不正确时,就会出现此问题int。在这种情况下,当尝试迭代非数组的内容时,自定义验证器中会发生错误。

如何让验证器@IsArray在自定义验证器之前执行?一般来说,有没有一种方法可以选择验证的顺序?

Jav*_*ien 9

Typescript 装饰器顺序如下:参见

  1. 每个装饰器的表达式都是从上到下计算的。
  2. 然后将结果作为函数从下到上调用。

这意味着class-validator从下到上检查验证装饰器
因此,您可以Post像这样编辑您的类。

export class Post {
  @NoMistakes() // 2nd
  @IsArray() // 1st
  tags: string[];
}
Run Code Online (Sandbox Code Playgroud)

并且您可以提供在出错时stopAtFirstError跳过的选项。 获取有关验证器选项的更多信息:https ://www.npmjs.com/package/class-validator#passing-options@NoMistakes()@IsArray