如何在Swagger/NestJS中显示多个ResponseDTO的模式?

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

我有一个可以返回以下两个不同DTO之一的路由:

@Get()
  @ApiQuery({ name: 'legacy', description: "'Y' to get houses legacy" })
  async findAllHouses(
    @Query('legacy') legacy: string,
  ): Promise<HousesDto[] | HousesLegacyDto[]> {
  ...
  }

我想把这两个ResponseDTO都展示出来。我试过这个装饰器:

@ApiOkResponse({
    schema: { oneOf: refs(HousesDto, HousesLegacyDto) },
  })
// OR
  @ApiOkResponse({
    schema: {
      oneOf: [
        { $ref: getSchemaPath(HousesDto) },
        { $ref: getSchemaPath(HousesLegacyDto) },
      ],
    },
  })

其中@ApiExtraModels()位于DTO类的顶部,@ApiProperty()位于每个属性上。
但我仍然在Swagger中得到空对象,我想它甚至不会考虑数组类型。
如何正确显示这两个架构?

hsgswve4

hsgswve41#

在我看来,像很多非常模糊的解决方案已经张贴在这里和那里,所以我会尽量澄清什么需要做。
您有两个DTO:

export class SomeStatusDto {
  @ApiProperty({
  description: 'Id',
  example: 1,
  })
  @IsNumber()
  id: number;

  @ApiProperty({
  description: 'Status',
  example: 'in_progress',
  })
  @IsString()
  status: string;
}

export class ErrorStatusDto {
  @ApiProperty({
  description: 'Id',
  example: 1,
  })
  @IsNumber()
  id: number;

  @ApiProperty({
  description: 'Error',
  example: 'Some error string',
  })
  @IsString()
  error: string;
}

然后,您的控制器:

@UseGuards(AccountTypesGuard)
  @ApiOperation({ summary: 'Get status of...' })
  @Get('status')
  @ApiExtraModels(SomeStatusDto, ErrorStatusDto)
  @ApiOkResponse({
    schema: { anyOf: refs(SomeStatusDto, ErrorStatusDto) },
  })
  async getPullStatus(
    @Request() req,
    @Param('id', ParseIntPipe) someId: number,
  ): Promise<SomeStatusDto | ErrorStatusDto> {

    // check if someId belongs to user
    const idBelongsToUser = await this.myService.validateSomeId(
      req.user.id,
      someId,
    );

    if (!idBelongsToUser) {
      throw new ForbiddenException(
        `SomeId does not belong to user (someId=${someId}, userId=${req.user.id})`,
      );
    }

    const key = `status-${someId}`;
    const response = await this.redisService.getByKey(key);
    return response ? response : {};
  }

请注意下面的解决方案。您需要将DTO引用为@ApiExtraModels(),然后可以将它们添加为anyOf:指涉(...)。

@ApiExtraModels(SomeStatusDto, ErrorStatusDto)
  @ApiOkResponse({
    schema: { anyOf: refs(SomeStatusDto, ErrorStatusDto) },
  })

希望这对某些人有帮助:)

gwo2fgha

gwo2fgha2#

所以我遇到了一个类似的问题,这就是如何获得上图所示的输出。
使用@ApiResponse装饰器,您可以使用examples属性设置两个响应,请尝试下面的代码示例

@ApiResponse({
    status: 200,
    description: 'Successful response',
    content: {
      'application/json': {
        examples: {
          HousesDto: { value: HousesDto },
          HousesLegacyDto: { value: HousesLegacyDto },
        },
      },
    },
})

相关问题