Swagger 模块中的前缀 url

Posted

技术标签:

【中文标题】Swagger 模块中的前缀 url【英文标题】:prefix url in Swagger module 【发布时间】:2020-07-02 06:37:05 【问题描述】:

我使用 Nest js 和 swagger 作为文档,但 Swagger 模块忽略了 setGlobalPrefix()。 在我的环境中,api前缀是 API_PREFIX=/api/v2 ,我在用邮递员测试它时没有问题,因为端点/url确实可以工作,即http://localhost:5000/api/v2/user/profile

但是swagger无法获取/api/v2前缀,swagger请求url是http://localhost:5000/user/profile这是错误的。

有什么想法吗?感谢您的帮助。

设置

```const SWAGGER_PREFIX = '/docs';

async function bootstrap(): Promise<void> 
  const app = await NestFactory.create(AppModule);

  if (!process.env.SWAGGER_ENABLE || process.env.SWAGGER_ENABLE === '1') 
    // eslint-disable-next-line @typescript-eslint/no-use-before-define
    createSwagger(app);
  

  app.use(bodyParser.json());
  app.use(helmet());
  app.use(
    cors(
      origin: process.env.API_CORS || '*'
    )
  );

  app.setGlobalPrefix(process.env.API_PREFIX || API_DEFAULT_PREFIX);

  const logInterceptor = app.select(CommonModule).get(LogInterceptor);
  app.useGlobalInterceptors(logInterceptor);

  await app.listen(process.env.API_PORT || API_DEFAULT_PORT);


function createSwagger(app: INestApplication) 
  const version = require('../package.json').version || '';

  const options = new DocumentBuilder()
    .setTitle(SWAGGER_TITLE)
    .setDescription(SWAGGER_DESCRIPTION)
    .setVersion(version)
    .setBasePath(process.env.API_PREFIX || API_DEFAULT_PREFIX)
    .addBearerAuth()
    .build();

  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup(SWAGGER_PREFIX, app, document);[![enter image description here][1]][1]


//swagger - the request url is http://localhost:5000/user/profile
which is supposed to be  http://localhost:5000/api/v2/user/profile

【问题讨论】:

【参考方案1】:

在设置 api 的全局前缀(在函数 bootstrap 中调用 setGlobalPrefix)后,您应该创建招摇(在函数 bootstrap 中调用 createSwagger)。然后它会自行查找 api 前缀,并在任何请求前添加它。

async function bootstrap(): Promise<void> 

    const app = await NestFactory.create(ApplicationModule);

    app.setGlobalPrefix(process.env.API_PREFIX || API_DEFAULT_PREFIX);

    if (!process.env.SWAGGER_ENABLE || process.env.SWAGGER_ENABLE === 'true') 
        createSwagger(app);
    

    await app.listen(process.env.API_PORT || API_DEFAULT_PORT);


function createSwagger(app: INestApplication) 

    const version = require('../package.json').version || '';

    const options = new DocumentBuilder()
        .setTitle(SWAGGER_TITLE)
        .setDescription(SWAGGER_DESCRIPTION)
        .setVersion(version)
        .build();

    const document = SwaggerModule.createDocument(app, options);
    SwaggerModule.setup(SWAGGER_PREFIX, app, document);

【讨论】:

【参考方案2】:

你确定这条线

  app.setGlobalPrefix(process.env.API_PREFIX || API_DEFAULT_PREFIX);

这一行的计算结果相同

.setBasePath(process.env.API_PREFIX || API_DEFAULT_PREFIX)

【讨论】:

以上是关于Swagger 模块中的前缀 url的主要内容,如果未能解决你的问题,请参考以下文章

***模块代码中的 Python @ (at) 前缀 - 它代表啥? [复制]

使用idea 创建springboot多模块项目

Spring Boot - Swagger - Swagger 不会将标准值更改为多模块项目的 ApiInfo/GlobalResponse

Swagger2

如何将 swagger 2.0 JSON 文件分解为多个模块

利用swagger模块开发flask的api接口帮助文档