当前位置: 首页 > 知识库问答 >
问题:

NestJs/Swager(OpenAPI)在查询参数中定义嵌套对象

沃皓轩
2023-03-14

我正在尝试正确定义 OpenAPI 规范,以便从该规范生成 api 客户端。我已经解决了一个问题,即我们有一个复杂的查询对象,其中包含嵌套对象和对象数组,用于获取 GET 路由。

让我们以这些类为例。

class Person {
  @ApiProperty()
  name!: string
  @ApiProperty()
  location!: string
}

class CompanyDto {
  @ApiProperty()
  name!: string

  @ApiProperty({
    type: [Person],
  })
  employees!: Person[]
}

和一个带有@Query decorator的get请求。

  @Get('test')
  async testing(@Query() dto: CompanyDto): Promise<void> {
    // ...
  }

我得到的是。

    {
      get: {
        operationId: 'testing',
        parameters: [
          {
            name: 'name',
            required: true,
            in: 'query',
            schema: {
              type: 'string',
            },
          },
          {
            name: 'name',
            in: 'query',
            required: true,
            schema: {
              type: 'string',
            },
          },
          {
            name: 'location',
            in: 'query',
            required: true,
            schema: {
              type: 'string',
            },
          },
        ],
        responses: {
          '200': {
            description: '',
          },
        },
        tags: ['booking'],
      },
    }

我还尝试通过添加@ApiQuery装饰器来定义查询参数,它几乎可以工作。

  @ApiQuery({
    style: 'deepObject',
    type: CompanyDto,
  })

-

{
  get: {
    operationId: 'testing',
    parameters: [
      {
        name: 'name',
        required: true,
        in: 'query',
        schema: {
          type: 'string',
        },
      },
      {
        name: 'name',
        in: 'query',
        required: true,
        schema: {
          type: 'string',
        },
      },
      {
        name: 'location',
        in: 'query',
        required: true,
        schema: {
          type: 'string',
        },
      },
      {
        name: 'name',
        in: 'query',
        required: true,
        schema: {
          type: 'string',
        },
      },
      {
        name: 'employees',
        in: 'query',
        required: true,
        schema: {
          type: 'array',
          items: {
            $ref: '#/components/schemas/Person',
          },
        },
      },
    ],
    responses: {
      '200': {
        description: '',
      },
    },
    tags: ['booking'],
  },
}

但是现在我正在将重复的查询定义混入一个。有没有办法防止或覆盖@Query定义?或者只是定义复杂@Query的更好方法?

共有1个答案

刘绍晖
2023-03-14

最终创建了一个自定义的装饰器来提取查询,而没有生成OpenAPI规范。

export const SilentQuery = createParamDecorator(
  (data: string | undefined, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest()
    if (data) {
      return request.query[data]
    } else {
      return request.query
    }
  },
)

所以现在可以使用带有deepObject样式的@ApiQuery了。

例如,如果您将ValidationPipes与类验证器一起使用。确保将validateCustomDecorator设置为true

@SilentQuery(new ValidationPipe({ validateCustomDecorators: true }))
 类似资料:
  • 在关于参数序列化的OpenAPI文档中,有一个简短的部分是关于如何序列化具有不同样式的查询、路径、标头和cookie参数。这些参数的模式被描述为OpenAPI风格的json模式,它允许对象和数组的无限嵌套。我在文档中没有找到任何关于如何处理这些的内容: https://swagger.io/docs/specification/serialization/ 让我们假设为任何参数提供的JSON模式如

  • 我正在用Swagger 2.0记录一个Rails应用程序,并使用Swagger-UI作为人类可读的文档/沙盒解决方案。 我有一个资源,客户端可以在其中存储任意元数据以供以后查询。根据 Rails 约定,查询将按如下方式提交: Rails将其转换为以下参数: 它可以很容易地用于为数据库生成适当的 子句。 Swagger里有支持这种东西的吗?我想最终让Swagger-UI提供一些方法来修改生成的请求,

  • 我们的API有这样的endpoint,通过合并这两组参数,同时支持来自< code>query和< code>body的参数。 例如: 生成的参数集将包含两个,和。 此endpoint可以用作: 或 有没有办法在Swagger中指定这种“双重性”? UPD 我想我应该将参数定义为:和

  • 问题内容: 我对mongodb还是很陌生,有一件事我现在无法解决: 假设您有以下文档(简体): 哪个查询将返回json-object,其值等于“ value2”? 这意味着,我需要这个json-object: 当然,我已经尝试了很多可能的查询,但是没有一个返回正确的查询,例如 有人可以帮我看看我在做什么错吗? 谢谢! 问题答案: 使用位置运算符 输出量 使用聚合 输出 使用Java驱动程序 输出

  • 让我们考虑一下这些帖子的集合。每个帖子都有一个评论数组,每个评论都有一个字符串数组,带有键“likes”,表示喜欢该评论的用户。 如何使用mongoose检查用户是否喜欢具有给定ID的评论?