【问题标题】:Class-validator - validate array of objectsClass-validator - 验证对象数组
【发布时间】:2020-02-09 02:24:04
【问题描述】:

我正在将 class-validator 包与 NestJS 一起使用,并且我希望验证一个对象数组,这些对象需要恰好有 2 个具有相同布局的对象:

到目前为止我有:

import { IsString, IsNumber } from 'class-validator';

export class AuthParam {
  @IsNumber()
  id: number;

  @IsString()
  type: string;

  @IsString()
  value: string;
}

import { IsArray, ValidateNested } from 'class-validator';
import { AuthParam } from './authParam.model';

export class SignIn {
  @IsArray()
  @ValidateNested({ each: true })
  authParameters: AuthParam[];
}

每个@kamilg 响应(我能够强制执行 2 个元素):

import { IsArray, ValidateNested, ArrayMinSize, ArrayMaxSize } from 'class-validator';
import { AuthParam } from './authParam.model';

export class SignInModel {
  @IsArray()
  @ValidateNested({ each: true })
  @ArrayMinSize(2)
  @ArrayMaxSize(2)
  authParameters: AuthParam[];
}

我仍然可以传递一个空数组或一个包含与 AuthParam 无关的其他对象的数组。

我应该如何修改它以获得验证?

另外,我如何在数组中强制执行 2 个元素? MinLength(2) 似乎与字符串有关...(已解决)

【问题讨论】:

    标签: arrays typescript validation nestjs class-validator


    【解决方案1】:

    @Type(() => AuthParam) 添加到您的阵列中,它应该可以工作。嵌套对象(数组)需要Type 装饰器。你的代码变成了

    import { IsArray, ValidateNested, ArrayMinSize, ArrayMaxSize } from 'class-validator';
    import { AuthParam } from './authParam.model';
    import { Type } from 'class-transformer';
    
    export class SignInModel {
      @IsArray()
      @ValidateNested({ each: true })
      @ArrayMinSize(2)
      @ArrayMaxSize(2)
      @Type(() => AuthParam)
      authParameters: AuthParam[];
    }
    

    如果您使用任何异常过滤器来修改错误响应,请务必小心。确保您了解类验证器错误的结构。

    【讨论】:

    • 嗨,关于如何在查询参数中为数字数组实现这一点的任何想法?想象一下我试图验证 [www.url.com/path?ids=1,2,3] ,其中 [ids] 应该是一个数字数组,仅此而已。尝试转换您的答案,但到目前为止没有成功。
    【解决方案2】:

    您可以使用以下内容:

    validator.arrayNotEmpty(array); // Checks if given array is not empty.

    validator.arrayMinSize(array, min); // Checks if array's length is at least `min` number.

    (https://github.com/typestack/class-validator#manual-validation)

    您可能需要考虑编写自定义验证器,以更好地反映您的业务需求。

    【讨论】:

    • 这很好地解决了元素数量问题 - 谢谢。数组内对象的验证仍然有效
    【解决方案3】:

    我知道我迟到了,但遇到了一些类型问题,然后尝试另一种方法来实现:

    export class AuthParam {
        @IsNumber()
        id: number;
      
        @IsString()
        type: string;
      
        @IsString()
        value: string;
      }
    

    验证函数

    @ValidatorConstraint()
    export class IsAuthArray implements ValidatorConstraintInterface {
        public async validate(authData: AuthParam[], args: ValidationArguments) {
            return Array.isArray(authData) && authData.reduce((a, b) => a && (typeof b.id === "number") && typeof b.type === "string" && typeof b.field === "string", true);
        }
    }
    
    export class SignInModel {
        @IsNotEmpty()
        @IsArray()
        @ArrayMinSize(2)
        @ArrayMaxSize(2)
        @Validate(IsAuthArray, {
            message: "Enter valid value .",
        })
        authParameters: AuthParam[];
      }
    

    也许它会帮助某人?

    【讨论】:

      【解决方案4】:
      
      const param1: AuthParam = Object.assign(new AuthParam(), {
        id: 1,
        type: 'grant',
        value: 'password'
      })
      
      const param2: AuthParam = Object.assign(new AuthParam(), {
        id: 1,
        type: 4,
        value: 'password'
      })
      
      const signInTest = new SignInModel()
      signInTest.authParameters = [param1, param2]
      
      validate(signInTest).then(e => {
        console.log(e[0].children[0].children[0])
      })
      

      这工作正常,这是:

      ValidationError {
        target: AuthParam { id: 1, type: 4, value: 'password' },
        value: 4,
        property: 'type',
        children: [],
        constraints: { isString: 'type must be a string' } }
      
      

      所以我只能假设正在验证的对象不是AuthParam

      instance
      const param2: AuthParam = {
        id: 1,
        type: 4,
        value: 'password'
      } as any
      

      正如预期的那样,这个对象上没有任何装饰器(这可能适用于 Nest.js 控制器和来自 body/req 的嵌套对象)——因此忽略了验证。

      请检查this (tl;dr - @Type 装饰器表单class-transformer)

      【讨论】:

        【解决方案5】:

        https://github.com/typestack/class-validator/pull/295

        刚刚在v0.10.2 发布,希望对您有所帮助!

        【讨论】:

          猜你喜欢
          • 2022-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-29
          • 1970-01-01
          • 2022-11-25
          • 2020-08-07
          相关资源
          最近更新 更多