NestJs验证请求正文中的数组

时间:2020-05-13 10:31:52

标签: arrays typescript validation nestjs class-validator

我正在尝试将验证插入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"}
]

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

当我将控制器中的设置从SettingArrayUpdateD更改为任何设置时,控制器接收到原始请求数据。

NestJs 6.10.14版本。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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