@nestjs/swagger:如何在没有 @ApiOkResponse 装饰器的情况下添加架构?

Posted

技术标签:

【中文标题】@nestjs/swagger:如何在没有 @ApiOkResponse 装饰器的情况下添加架构?【英文标题】:@nestjs/swagger: How to add schema without @ApiOkResponse decorator? 【发布时间】:2021-10-30 20:17:06 【问题描述】:

我有两个 DTO。用户 DTO 和用户 DTO。 UsersDTO 大摇大摆地显示,因为我有一个端点来获取用户列表,对于那个端点我有

  @ApiOkResponse(
    status: HttpStatus.OK,
    type: UsersDTO,
  )

在 UsersDTO 中,我使用 $ref 来使用 UserDTO。 UsersDTO 看起来像

export class UsersDTO 
  @ApiProperty(
    type: 'array',
    items:  $ref: getSchemaPath(UserDTO) ,
  )
  @IsArray()
  readonly items: UserDTO[];

  @ApiProperty(
    type: 'object',
    properties: 
      totalItems: 
        type: 'number',
        example: 100,
      ,
      itemCount: 
        type: 'number',
        example: 10,
      ,
      itemsPerPage: 
        type: 'number',
        example: 10,
      ,
      totalPages: 
        type: 'number',
        example: 10,
      ,
      currentPage: 
        type: 'number',
        example: 2,
      ,
    ,
  )
  @IsObject()
  readonly meta: IMeta;

但它不招摇。 Swagger 将 [string] 显示为 items 的值。

有没有办法让它工作?

【问题讨论】:

【参考方案1】:

看起来您没有另一个端点在 @ApiOkResponse 中使用 UserDTO,例如

@ApiOkResponse(
    status: HttpStatus.OK,
    type: UserDTO,
  )

这意味着 Swagger 不能在 Schemas 之间进行引用。

如果您添加另一个端点,例如获取单个用户,并使用提供的@ApiOkResponse,它将起作用。

但是,如果您不需要该端点,您也可以通过以下方式在设置阶段向 Swagger 提供 DTO 架构

    const document = SwaggerModule.createDocument(
      app,
      new DocumentBuilder()
        .setTitle('API')
        .setDescription('API')
        .setVersion('1.0')
        .addBearerAuth()
        .build(),
       extraModels: [UserDTO] ,
    );

    SwaggerModule.setup(swaggerPath, app, document);

您可以使用它直接使用@ApiOkResponse 装饰器添加端点中未使用的模式。 extraModels 是一个带有所需架构的数组

【讨论】:

以上是关于@nestjs/swagger:如何在没有 @ApiOkResponse 装饰器的情况下添加架构?的主要内容,如果未能解决你的问题,请参考以下文章

NestJs/swagger:定义没有 DTO 类的引用模式

@nestjs/swagger:如何添加 API URL?

如何使用 nestjs/swagger 更改查询参数序列化?

NestJS Swagger - 如何声明多选枚举字段?

NRWL + NestJS 尝试使用 Swagger 插件

“nestjs/swagger”中的哪个函数将 DTO 转换为 Swagger 模型定义?