docfy export
Bootet die eigene Nest-App des Projekts und schreibt das OpenAPI-Dokument, ohne einen Port zu binden oder laufende Infrastruktur zu benötigen.
Warum es das gibt
Das Einzige, was SwaggerModule.createDocument() strukturell braucht, ist eine vollständig initialisierte Nest-App: Ihr DI-Container muss jeden Provider auflösen, bevor Route- und DTO-Metadaten zur Introspektion existieren.
Das erfordert kein .listen(). Es wird kein Port gebunden.
In der Praxis braucht es meist auch keine laufende Infrastruktur: Die meisten TypeOrmModule-, ioredis- und kafkajs-Clients verbinden sich lazy statt den Bootstrap zu blockieren, sodass export in der Regel auch funktioniert, wenn Datenbank, Redis und Kafka alle gestoppt sind.
Verwendung
Stell eine kleine Entry-Datei bereit (dieselben Zeilen, die deine main.ts schon hat, minus .listen()):
// 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
}npx nestjs-docfy export --entry docfy-export.ts --out openapi.jsonInformative Ausgabe geht immer nach stderr, nie nach stdout, das Piping ist also sicher: npx nestjs-docfy export --entry docfy-export.ts > openapi.json.
Der Entry-Datei-Vertrag
Der Default-Export ist eine asynchrone Funktion, die { app, document } zurückgibt. export führt sie in einem Child-Prozess aus, serialisiert document und ruft danach für dich app.close() auf.
Eine .ts-Entry-Datei braucht ts-node als devDependency in deinem Projekt (und auch tsconfig-paths, für Pfad-Aliase wie @app/common).
Optionen
| 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 |
Ein Provider mit einer wirklich eager, hart fehlschlagenden Verbindung in seinem Konstruktor oder onModuleInit profitiert nicht davon, Infra auf diese Weise zu überspringen. Nichts in export ändert, wie deine eigenen Provider sich verbinden. Es vermeidet nur das eine, was NestJS selbst nicht braucht: einen offenen Port.