基于版本控制的NestJs + Swagger文档

问题描述 投票:0回答:2

我已经构建了一个nestjs webapi,并按照https://docs.nestjs.com/techniques/versioning

在控制器和操作级别实现了版本控制

我正在研究的解决方案是,我想根据控制器版本生成2个不同的swagger。 例如,我为 2 个不同版本定义了 2 个控制器。如果我点击 [example.com/v1/swagger] ,它应该只加载 v1 版本控制器 swagger 文档,v2 也类似

nestjs swagger-ui nestjs-swagger
2个回答
3
投票

我最近更新了 API 以支持版本控制。我无法正确加载 Swagger 文档。这是我的解决方案,希望对您有所帮助!

之前,我们使用

app.setGlobalPrefix(APP_ROUTE_PREFIX)
来定义前缀。

const APP_ROUTE_PREFIX = 'api/v2';
app.setGlobalPrefix(APP_ROUTE_PREFIX);

Swagger 文档安装为:

SwaggerModule.setup(`${APP_ROUTE_PREFIX}/docs`, app, document);

为了采用版本控制,更改了以下内容。

  1. 路由前缀不再包含版本;让 Nestjs 来处理吧。
const APP_ROUTE_PREFIX = 'api';
  1. 版本控制已启用,默认值为“2”,模仿以前的行为。
  app
    .enableVersioning({ type: VersioningType.URI, defaultVersion: '2' })
    .setGlobalPrefix(APP_ROUTE_PREFIX);
  1. 为了正确安装 Swagger 文档,我们必须在路径中使用变量
    :version
  SwaggerModule.setup(`${APP_ROUTE_PREFIX}/:version/docs`, app, document);
  1. 接下来,我们以每个控制器为基础更改了需要采用版本控制的控制器。
@Controller({ path: 'objects/:id', version: ['2', '3'] })
  1. 最后,我们在每个路由的基础上更改了支持多个版本的处理程序。
  @Version('2')
  getPageV2(): Promise<Observable<unknown>> {
    return this.service.getOkayData();
  }

  @Version('3')
  getPageV3(): Promise<Observable<unknown>> {
    return this.service.getBetterData();
  }

0
投票

app.enableVersioning();应该在 SwaggerModule.createDocument(...) 之前调用

来源:https://github.com/nestjs/swagger/issues/1495#issuecomment-898311614

© www.soinside.com 2019 - 2024. All rights reserved.