如何在NestJS生成的Swagger文档中定义响应正文对象?

yxyvkwin  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(302)

我正在使用NestJs和它的Swagger插件来自动生成我的API的文档。
问题是,我想不出如何使响应模式出现在文档中。在我的GET路由中,我得到的只是“代码200”,没有数据结构。
我有一个典型的设置,其中控制器方法使用相应的服务方法,而服务方法又使用TypeOrm存储库。

@Get()
 findAll() {    
   return this.usersService.findAll();
}

我尝试过使用 @ApiResponse 装饰器,但是并没有发现任何方法可以使它达到这个目的。另外,创建一个user.dto.ts并将其作为控制器路由的返回类型也没有任何效果。
最后,这就是我在斯瓦格得到的:

如何定义响应体模式?

3yhwsihp

3yhwsihp1#

您可以将typeisArray属性与ApiResponse装饰器系列结合使用。例如:

@ApiOkResponse({
    description: 'The user records',
    type: User,
    isArray: true
})
@Get()
 findAll() {    
   return this.usersService.findAll();
}

此外,考虑使用Swagger CLI plugin来帮助您在构建时自动应用这些装饰器,而不必手动保持所有内容同步。

c3frrgcw

c3frrgcw2#

您可以使用ApiExtraModels注解控制器动作:

import { ApiExtraModels, ApiResponse, getSchemaPath } from '@nestjs/swagger'
import { Controller, Get, Param } from '@nestjs/common';

@Controller('users')
export class UsersController {

 @ApiExtraModels(UserDto)
 @ApiResponse({
    status: 200,
    schema: {
      $ref: getSchemaPath(OrderDto),
    },
  })
  @Get('/:userId')
  getById(@Param('userId') userId: string): UserDto {
     ... something happens ... 
     return myUserDto;
  }

}

并且还必须使用ApiProperty来注解UserDto属性:

import { ApiProperty } from '@nestjs/swagger'
import { Expose } from 'class-transformer'
import { IsString } from 'class-validator'

export class UserDto {

  @ApiProperty()
  @IsString()
  @Expose()
  id: string;
}

顺便说一句,检查CLI plugin for generating ApiProperty

相关问题