определить DTO для ApiParam и ApiQuery - PullRequest
3 голосов
/ 26 апреля 2020

Я использую модуль nest js swagger и хочу создать документацию по API. Для конечных точек, полагающихся на тело запроса, я могу назначить класс DTO документам, таким как

@ApiBody({ type: CreateUserDTO })

Некоторые конечные точки также полагаются на параметры или запросы запроса. Для параметров я бы сделал что-то вроде

@ApiParam({ type: GetUserByIdDTO })

(я знаю, что это плохой пример, потому что нет необходимости в DTO для идентификатора пользователя, но давайте предположим, что вы хотите проверить свои параметры с помощью класса DTO, используя class-validator)

но я получаю эту ошибку

Аргумент типа '{type: typeof GetUserByIdDTO; } 'нельзя назначить параметру типа' ApiParamOptions '. Свойство 'name' отсутствует в типе '{type: typeof GetUserByIdDTO; } 'но требуется в типе' ApiParamMetadata '.

Для запросов я бы сделал что-то вроде

@ApiQuery({ type: GetUsersDTO })

и получил бы эту ошибку

Аргумент type '{type: typeof GetUsersDTO; } 'нельзя назначить параметру типа' ApiQueryOptions '. Свойство 'name' отсутствует в типе '{type: typeof GetUsersDTO; } 'но требуется для типа' ApiQueryMetadata '.

Таким образом, кажется, что декоратор APIBody работает нормально, но как я могу исправить мои декораторы APIParam и APIQuery?

1 Ответ

1 голос
/ 28 апреля 2020

@ApiQuery и @ApiParam необходимы при работе с именованными параметрами / запросами, например @Query('pageSize') o @Param('id'). В этом случае модуль Nest JS Swagger должен извлекать информацию напрямую из указанного объекта DTO, например:

async findElements(@Query() query: ElementsQueryDto) {
  // ...
}

Важно отметить, что Dtos должны быть классами, а не интерфейсами .

...