NestJs проверяет массив в теле запроса

Я пытаюсь вставить проверку в запрос 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 на любые, контроллер получил исходные данные запроса.

Версия NestJs 6.10.14.


person sniffysko    schedule 13.05.2020    source источник


Ответы (2)


Чтобы проверить массив, создайте специальный класс, который содержит свойство, которое обертывает массив, или используйте ParseArrayPipe.

@Post()
createBulk(
  @Body(new ParseArrayPipe({ items: CreateUserDto }))
  createUserDtos: CreateUserDto[],
) {
  return 'This action adds new users';
}
person Eldari    schedule 17.12.2020
comment
ParseArrayPipe из Nest.js v7, автор искал решение в v6 - person arkus; 11.03.2021
comment
Работает ли это для вас? У меня проблемы в моем проекте с последней версией NestJS - person manuelnucci; 25.04.2021

С определением класса SettingArrayUpdateDto вам необходимо отправить полезные данные, которые полностью соответствуют ему. Это означает, что ваша полезная нагрузка должна быть

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

Поскольку SettingArrayUpdateDto имеет свойство items типа SettingUpdateDto[].

person Jay McDoniel    schedule 13.05.2020