docfy export
启动项目自身的 Nest 应用并写出 OpenAPI 文档,不绑定端口,也不需要真实基础设施。
为什么需要它
SwaggerModule.createDocument() 在结构上唯一真正需要的,是一个完全初始化好的 Nest 应用:它的 DI 容器必须先解析完每一个 provider,路由和 DTO 的元数据才有得可读。
这并不需要 .listen(),不会绑定任何端口。
实践中通常也不需要真实基础设施:大多数 TypeOrmModule、ioredis 和 kafkajs 客户端都是惰性连接,而不是在启动时阻塞,所以即便数据库、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)。
选项
| Option | Default | Description |
|---|---|---|
--entry <path> | (required) | .ts/.js file whose default export returns { app, document } |
--out <path> | stdout | Where to write the document |
--root <path> | . | Project root — where ts-node/tsconfig-paths are resolved from |
--quiet | false | Suppress informational output |
什么情况下这帮不上忙
如果某个 provider 的构造函数或 onModuleInit 里有真正急切且会硬失败的连接逻辑,跳过基础设施这一套并不会有帮助。export 无法改变你自己的 provider 如何连接,它只是避开了 NestJS 本身其实并不需要的那一件事:打开一个端口。