【问题标题】:NestJs validate array in request bodyNestJs 验证请求正文中的数组
【发布时间】:2020-08-29 12:13:09
【问题描述】:

我正在尝试在 PUT 请求中插入验证。

DTO:

export class SettingUpdateDto implements ISettingUpdate {
    @IsInt()
    @IsPositive()
    id: number;

    @IsNotEmpty()
    @IsString()
    value: string;
}

export class SettingArrayUpdateDto {
    @Type(() => SettingUpdateDto)
    @ValidateNested({ each: true })
    items: SettingUpdateDto[];
}

控制器

@Put()
async updateItem(@Body() items: SettingArrayUpdateDto) {
    return await this.dataService.update(items);
}

服务

async update(items: SettingArrayUpdateDto[]): Promise<Setting> {
    console.log("service data", items);
    return <Setting>{}; <SettingUpdateDto[]>items;
}

当我发送数据时,像这样:

[
    {"id": -20, "value": {"name": "333"}},
    {"id": 21, "value": "2222222222222222"}
]

我收到了空数组。我究竟做错了什么?哪里错了?

当我将控制器中的设置从 SettingArrayUpdateDto 更改为 any 时,控制器会收到原始请求数据。

NestJs 6.10.14 版本。

【问题讨论】:

    标签: arrays typescript validation nestjs class-validator


    【解决方案1】:

    使用SettingArrayUpdateDto 类的定义,您需要发送与其完全匹配的有效负载。这意味着您的有效载荷需要是

    {
      "items": [
        {"id": -20, "value": {"name": "333"}},
        {"id": 21, "value": "2222222222222222"}
      ]
    }
    

    因为SettingArrayUpdateDto 具有items 类型的SettingUpdateDto[] 属性。

    【讨论】:

      【解决方案2】:

      要验证数组,请创建一个包含封装数组的属性的专用类,或使用ParseArrayPipe

      @Post()
      createBulk(
        @Body(new ParseArrayPipe({ items: CreateUserDto }))
        createUserDtos: CreateUserDto[],
      ) {
        return 'This action adds new users';
      }
      

      【讨论】:

      • ParseArrayPipe来自Nest.js v7,作者在v6中寻找解决方案
      • 它对你有用吗?我在运行最新版本的 NestJS 的项目中遇到问题
      猜你喜欢
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2021-02-15
      • 2021-05-03
      相关资源
      最近更新 更多