docfy export

启动项目自身的 Nest 应用并写出 OpenAPI 文档,不绑定端口,也不需要真实基础设施。

为什么需要它

SwaggerModule.createDocument() 在结构上唯一真正需要的,是一个完全初始化好的 Nest 应用:它的 DI 容器必须先解析完每一个 provider,路由和 DTO 的元数据才有得可读。

这并不需要 .listen(),不会绑定任何端口。

实践中通常也不需要真实基础设施:大多数 TypeOrmModuleiorediskafkajs 客户端都是惰性连接,而不是在启动时阻塞,所以即便数据库、Redis、Kafka 都处于停止状态,export 往往也能正常工作。

用法

提供一个小的入口文件(内容和你 main.ts 里已有的一样,只是去掉 .listen()):

ts
// docfy-export.ts
import { NestFactory } from '@nestjs/core';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { AppModule } from './app.module';

export default async function () {
  const app = await NestFactory.create(AppModule, { logger: false });
  const config = new DocumentBuilder().setTitle('My API').setVersion('1.0.0').build();
  const document = SwaggerModule.createDocument(app, config);
  return { app, document }; // `app` gets closed for you afterward
}
bash
npx nestjs-docfy export --entry docfy-export.ts --out openapi.json

提示性输出始终发往 stderr,从不发往 stdout,所以可以放心地管道传递:npx nestjs-docfy export --entry docfy-export.ts > openapi.json

入口文件的约定

默认导出是一个返回 { app, document } 的异步函数。export 会在一个子进程里运行它,序列化 document,并在结束后帮你调用 app.close()

.ts 入口文件需要项目把 ts-node 作为 devDependency(如果用了路径别名比如 @app/common,还需要 tsconfig-paths)。

选项

OptionDefaultDescription
--entry <path>(required).ts/.js file whose default export returns { app, document }
--out <path>stdoutWhere to write the document
--root <path>.Project root — where ts-node/tsconfig-paths are resolved from
--quietfalseSuppress informational output
什么情况下这帮不上忙

如果某个 provider 的构造函数或 onModuleInit 里有真正急切且会硬失败的连接逻辑,跳过基础设施这一套并不会有帮助。export 无法改变你自己的 provider 如何连接,它只是避开了 NestJS 本身其实并不需要的那一件事:打开一个端口。