4

我有两个 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.

有什么办法让它工作吗?

4

1 回答 1

3

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

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

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

如果您添加另一个端点,例如,获取单个用户,并使用提供的@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是一个包含所需模式的数组

于 2021-09-01T10:30:34.013 回答