类验证器 - 验证对象数组

ben*_*siu 24 arrays validation typescript class-validator nestjs

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

到目前为止,我有:

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

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

  @IsString()
  type: string;

  @IsString()
  value: string;
}
Run Code Online (Sandbox Code Playgroud)

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

export class SignIn {
  @IsArray()
  @ValidateNested({ each: true })
  authParameters: AuthParam[];
}
Run Code Online (Sandbox Code Playgroud)

每个@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[];
}
Run Code Online (Sandbox Code Playgroud)

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

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

另外我如何强制数组中的 2 个元素?MinLength(2) 似乎是关于字符串...(已解决)

You*_*han 61

添加@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[];
}
Run Code Online (Sandbox Code Playgroud)

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

  • 你好,我尝试了类似的方法并且按预期工作。但我注意到,当数组包含空数组(而不是 AuthParam obj)时,它不会抛出错误。如何确保数组只包含对象而不包含数组? (2认同)

Dha*_*val 10

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

export class AuthParam {
    @IsNumber()
    id: number;
  
    @IsString()
    type: string;
  
    @IsString()
    value: string;
  }
Run Code Online (Sandbox Code Playgroud)

验证功能

@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[];
  }
Run Code Online (Sandbox Code Playgroud)

也许它会对某人有帮助