swagger 如何使用nestjs生成openapi规范而不运行应用程序

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

我们有很多用nodejs编写的API,使用的是nestjs框架。我们可以使用nestjs的SwaggerModule生成openapi.yaml。这很好用。但问题是它需要API启动,因此数据库也要启动并运行。这是我们CI/CD中的一个问题,因为我们需要在运行API之前生成openapi规范。
有没有可能从我们的代码中生成openapi规范,而不需要运行应用程序?或者有没有一种简单的方法来模拟我们的数据库?
谢谢你的帮助

oknwwptz

oknwwptz1#

简短的回答是不,there isn't a way to generate the docs,不运行NestJS应用程序。但是,您可以生成一个表示OpenAPI文档的JSON文件,然后从那里生成一个静态网站。这个问题让您完成了一半:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  const options = new DocumentBuilder()
    .setTitle('Cats example')
    .setDescription('The cats API description')
    .setVersion('1.0')
    .addTag('cats')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  const outputPath = path.resolve(process.cwd(), 'swagger.json');
  writeFileSync(outputPath, JSON.stringify(document), { encoding: 'utf8'});

  await app.close();
}
bootstrap();

这将生成一个包含OpenAPI规范的文件swagger.json。从那里,你可以使用一个tool like Spectacle来生成实际的HTML:

npx spectacle-docs -t public/docs swagger.json

一个更少文档记录的特性是仅使用curl从常规端点检索OpenAPI规范的JSON表示的能力。
假设您有一个标准的@nestjs/swagger集成,它将OpenAPI文档发布到/docs/

const options = new DocumentBuilder()
    .setTitle('core-api')
    .setDescription('The core API description')
    .setVersion('3.0')
    .addTag('core-api')
    .setBasePath(version)
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('docs', app, document);

如果你浏览到http:/localhost:3000/docs/,你可以访问文档的HTML版本。但是,如果你浏览到http://localhost:3000/docs-json,你会收到一个JSON表示。只要把-json附加到你指定的路径上就可以了。
把这些联系在一起,你就可以把它们集成到一个CI管道中。我已经把它们集成到一个Gitlab CI管道中,如下所示:

script:
  - until nc -vz $API_IP 3000; do sleep 1; done
  - curl http://$API_IP:3000/docs-json -o swagger.json
  - npx spectacle-docs -t public/docs swagger.json

在CI管道中,您仍然需要运行NestJS应用程序以及Mongo和启动它所需的任何其他相关服务,但是一旦生成JSON,您就可以停止应用程序,构建静态HTML站点并将其发布到其他地方。

ymdaylpp

ymdaylpp2#

我设法在不启动服务器的情况下从我的e2e测试中生成了swagger规范
在不运行nest js服务器的情况下生成swagger json文件

相关问题