首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类-验证器-验证对象数组

类-验证器-验证对象数组
EN

Stack Overflow用户
提问于 2019-10-11 14:21:34
回答 4查看 91.7K关注 0票数 52

我使用的是带有NestJS的类验证器包,并且我希望验证一个对象数组,这些对象需要有两个具有相同布局的对象:

到目前为止,我已经:

代码语言:javascript
复制
import { IsString, IsNumber } from 'class-validator';

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

  @IsString()
  type: string;

  @IsString()
  value: string;
}

代码语言:javascript
复制
import { IsArray, ValidateNested } from 'class-validator';
import { AuthParam } from './authParam.model';

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

per @kamilg回复(我能够精确地执行两个元素):

代码语言:javascript
复制
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无关的其他对象传递一个空数组或一个数组。

我应该如何修改它才能得到验证?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-13 18:04:46

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

代码语言:javascript
复制
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[];
}

如果您使用任何异常筛选器来修改错误响应,请小心。确保您理解类验证器错误的结构。

票数 134
EN

Stack Overflow用户

发布于 2021-05-13 06:54:07

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

代码语言:javascript
复制
export class AuthParam {
    @IsNumber()
    id: number;
  
    @IsString()
    type: string;
  
    @IsString()
    value: string;
  }

验证函数

代码语言:javascript
复制
@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[];
  }

也许它会对某人有帮助

票数 5
EN

Stack Overflow用户

发布于 2019-10-11 16:25:57

您可以使用以下内容:

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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58343262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档