Kurs NestJS · Moduł 11: Swagger i OpenAPI
Instalacja i konfiguracja Swagger w NestJS
W tej lekcji6
Zanim nasi kronikarze rozpoczną spisywanie annałów, musimy przygotować odpowiednie narzędzia - pergamin, atrament i pieczęcie cesarskie. W NestJS oznacza to instalację pakietu @nestjs/swagger i konfigurację modułu Swagger.
Instalacja pakietu
Pierwszym krokiem jest zainstalowanie oficjalnego pakietu Swagger dla NestJS:
1npm install @nestjs/swaggerPakiet @nestjs/swagger zawiera wszystko, czego potrzebujemy: dekoratory, moduł konfiguracyjny i integrację ze Swagger UI.
DocumentBuilder - Architekt Kronik
DocumentBuilder to klasa, która pozwala zbudować konfigurację dokumentacji API. Działa jak architekt, który projektuje strukturę naszych annałów:
1import { DocumentBuilder } from '@nestjs/swagger';
2
3const config = new DocumentBuilder()
4 .setTitle('Imperium Romanum API')
5 .setDescription('Dokumentacja API zarządzania Imperium Rzymskim')
6 .setVersion('1.0')
7 .build();Metody DocumentBuilder
| Metoda | Opis | Przykład |
|---|---|---|
setTitle() | Nazwa dokumentacji | 'Imperium API' |
setDescription() | Opis projektu | 'API do zarządzania legionami' |
setVersion() | Wersja API | '1.0', '2.3.1' |
addTag() | Dodaje tag (sekcję) | 'Legiones' |
addBearerAuth() | Konfiguruje JWT auth | Opcje bearer |
setContact() | Dane kontaktowe | Imię, URL, email |
setLicense() | Licencja API | Nazwa, URL |
addServer() | Serwer API | URL, opis |
build() | Finalizuje konfigurację | Zwraca OpenAPI object |
SwaggerModule.setup() - Otwarcie Forum
Po zbudowaniu konfiguracji, musimy "otworzyć Forum" - czyli udostępnić dokumentację pod określonym adresem URL:
1import { NestFactory } from '@nestjs/core';
2import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
3import { AppModule } from './app.module';
4
5async function bootstrap() {
6 const app = await NestFactory.create(AppModule);
7
8 // 1. Budujemy konfigurację dokumentacji
9 const config = new DocumentBuilder()
10 .setTitle('Imperium Romanum API')
11 .setDescription('API do zarządzania prowincjami i legionami Imperium')
12 .setVersion('1.0')
13 .addTag('Legiones', 'Zarządzanie legionami')
14 .addTag('Provinciae', 'Zarządzanie prowincjami')
15 .addTag('Tributum', 'System podatkowy')
16 .addBearerAuth()
17 .build();
18
19 // 2. Tworzymy dokument OpenAPI
20 const document = SwaggerModule.createDocument(app, config);
21
22 // 3. Udostępniamy Swagger UI pod ścieżką /api/docs
23 SwaggerModule.setup('api/docs', app, document);
24
25 await app.listen(3000);
26}
27bootstrap();Po uruchomieniu aplikacji, Swagger UI będzie dostępny pod adresem http://localhost:3000/api/docs.
Parametry SwaggerModule.setup()
Metoda setup() przyjmuje cztery argumenty:
- path - ścieżka URL dokumentacji (np.
'api/docs') - app - instancja aplikacji NestJS
- document - wygenerowany dokument OpenAPI
- options (opcjonalne) - dodatkowe opcje konfiguracyjne
1SwaggerModule.setup('api/docs', app, document, {
2 customSiteTitle: 'Kroniki Imperium API',
3 customfavIcon: '/favicon.ico',
4 swaggerOptions: {
5 persistAuthorization: true,
6 docExpansion: 'none',
7 filter: true,
8 },
9});Rozbudowana konfiguracja DocumentBuilder
Oto pełny przykład konfiguracji z wszystkimi opcjami:
1const config = new DocumentBuilder()
2 .setTitle('Imperium Romanum API')
3 .setDescription('Kompletna dokumentacja API Imperium Rzymskiego')
4 .setVersion('2.0')
5 .setContact('Cezar Augustus', 'https://imperium.rome', 'caesar@rome.gov')
6 .setLicense('MIT', 'https://opensource.org/licenses/MIT')
7 .addServer('http://localhost:3000', 'Serwer deweloperski')
8 .addServer('https://api.imperium.rome', 'Serwer produkcyjny')
9 .addTag('Legiones', 'Endpointy zarządzania legionami')
10 .addTag('Provinciae', 'Endpointy zarządzania prowincjami')
11 .addBearerAuth(
12 { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
13 'JWT-auth',
14 )
15 .build();Ćwiczenie praktyczne
Skonfiguruj Swagger w pliku main.ts projektu Imperium:
Zapamiętaj tę zasadę, młody kronikarzu: DocumentBuilder projektuje treść annałów, czyli tytuł, wersję, tagi i sposób uwierzytelniania, a SwaggerModule.setup() otwiera forum, na którym każdy legionista przeczyta dokumentację Twojego API bez pytania Ciebie o cokolwiek.
Kod do tej lekcji: src/main.ts
1// Konfiguracja Swagger w main.ts
2import { NestFactory } from '@nestjs/core';
3import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
4
5async function bootstrap() {
6 // const app = await NestFactory.create(AppModule);
7
8 // TODO: Stworz konfiguracje DocumentBuilder
9 // Uzyj metod: setTitle, setDescription, setVersion, addTag, build
10 const config = new DocumentBuilder()
11 .setTitle('Imperium Romanum API')
12 // TODO: Dodaj opis API
13 // TODO: Ustaw wersje na '1.0'
14 // TODO: Dodaj tag 'Legiones' z opisem
15 // TODO: Dodaj tag 'Provinciae' z opisem
16 .build();
17
18 // TODO: Stworz dokument OpenAPI
19 // const document = SwaggerModule.createDocument(app, config);
20
21 // TODO: Udostepnij Swagger UI pod sciezka 'api/docs'
22 // SwaggerModule.setup('api/docs', app, document);
23
24 // await app.listen(3000);
25 console.log("Swagger UI dostepne pod: http://localhost:3000/api/docs");
26}
27
28bootstrap();
29
30// Przykladowa pelna konfiguracja:
31console.log("=== DocumentBuilder ===");
32console.log("setTitle() - nazwa dokumentacji");
33console.log("setDescription() - opis projektu");
34console.log("setVersion() - wersja API");
35console.log("addTag() - sekcja (grupa endpointow)");
36console.log("addBearerAuth() - konfiguracja JWT");
37console.log("build() - finalizacja konfiguracji");
38console.log("");
39console.log("=== SwaggerModule ===");
40console.log("createDocument(app, config) - generuje OpenAPI spec");
41console.log("setup(path, app, document) - uruchamia Swagger UI");
42Widzisz błąd w tej lekcji?
Sprawdź się
Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.
1. Jaka klasa w @nestjs/swagger służy do budowania konfiguracji dokumentacji API?
2. Jakie argumenty przyjmuje metoda SwaggerModule.setup() w minimalnej konfiguracji?
To 2 z 3 pytań do tej lekcji. Pozostałe rozwiążesz w grze.
Zadania praktyczne w grze
- Edytor kodu
Uzupełnij konfigurację Swagger w main.ts dodając opis, wersję i tagi do DocumentBuilder
- Układanie w poziomie
Ułóż łańcuch metod DocumentBuilder w prawidłowej kolejności:
- Klikanie w kolejności
Ułóż kroki konfiguracji Swagger w main.ts we właściwej kolejności:
- Edytor kodu
Dodaj @ApiTags('Centuriones') do kontrolera i @ApiOperation z summary do metod