使用 class-validator 和 Nest.js 验证对象数组

Posted

技术标签:

【中文标题】使用 class-validator 和 Nest.js 验证对象数组【英文标题】:Validate an array of objects with class-validator and Nest.js 【发布时间】:2022-01-19 01:47:30 【问题描述】:

我正在使用带有 NestJS 的类验证器,并尝试使用以下布局验证对象数组:

[
    gameId: 1, numbers: [1, 2, 3, 5, 6],
    gameId: 2, numbers: [5, 6, 3, 5, 8]
]

我的解析器

createBet(@Args('createBetInput') createBetInput: CreateBetInput) 
    return this.betsService.create(createBetInput);
  

我的 createBetInput DTO

import  InputType, Field, Int  from '@nestjs/graphql';
import  IsArray, IsNumber  from 'class-validator';

@InputType()
export class CreateBetInput 
  @IsNumber()
  @Field(() => Int)
  gameId: number;

  @Field(() => [Int])
  @IsArray()
  numbers: number[];

我尝试了一些解决方案,但没有成功,老实说,我不知道该怎么做。

如何修改 DTO 以获得必要的验证?

【问题讨论】:

【参考方案1】:

class-validatorclass-transformer 混合的选项可用于验证嵌套对象,您的 Array 也是嵌套对象,因此您可以像这样进行验证:

import  Type  from 'class-transformer';
import  IsArray, ValidateNested  from 'class-validator';

class ItemsOfBet 
  @IsArray()
  @ValidateNested( each: true )
  @Type(() => CreateBetInput)
  items: CreateBetInput[];

【讨论】:

以上是关于使用 class-validator 和 Nest.js 验证对象数组的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 中使用 `class-validator` 确认密码

如何使用 NestJS 和 class-validator 手动测试输入验证

NestJS DTO 类设置 class-validator 和 class-transformer 执行顺序

是否可以将 `class-validator` 与 antd `Form.useForm`() 一起使用?

Class-validator - 验证对象数组

在 NestJS 中抛出与 `class-validator` 相同的错误格式