fastify를 사용하는 경우 swagger-ui-express 대신 fastify-swagger를 설치해야합니다.
$npminstall--save@nestjs/swaggerfastify-swagger
Bootstrap
설치 프로세스가 완료되면 부트 스트랩 파일 (대부분 main.ts)을 열고 SwaggerModule 클래스를 사용하여 Swagger를 초기화 하십시오.
import{NestFactory}from'@nestjs/core';import{SwaggerModule,DocumentBuilder}from'@nestjs/swagger';import{ApplicationModule}from'./app.module';asyncfunctionbootstrap(){constapp=awaitNestFactory.create(ApplicationModule);constoptions=newDocumentBuilder().setTitle('Cats example').setDescription('The cats API description').setVersion('1.0').addTag('cats').build();constdocument=SwaggerModule.createDocument(app,options);SwaggerModule.setup('api',app,document);awaitapp.listen(3000);}bootstrap();
DocumentBuilder는 SwaggerModule의 기본 문서를 구성하는 데 도움을 주는 헬퍼 클래스입니다. 제목, 설명, 버전 등과 같은 속성을 설정할 수있는 몇가지 방법이 포함되어 있습니다.
정의된 HTTP 경로로 전체 문서를 만들려면 SwaggerModule 클래스의 createDocument()메소드를 사용하십시오. 이 메소드는 각각 응용 프로그램 인스턴스와 기본 Swagger 옵션의 두가지 인수를 사용합니다.
마지막 단계는 setup()을 호출하는 것입니다. (1) Swagger를 장착하는 경로, (2) 응용 프로그램 인스턴스, (3) Nest 애플리케이션을 설명하는 문서를 순차적으로 허용합니다.
이제 다음 명령을 실행하여 HTTP 서버를 시작할 수 있습니다.
응용 프로그램이 실행되는 동안 브라우저를 열고 http://localhost:3000/api로 이동하십시오. 비슷한 페이지가 나타납니다.
SwaggerModule은 모든 엔드 포인트를 자동으로 반영합니다. 백그라운드에서는 swagger-ui-express를 사용하고 라이브 문서를 만듭니다.
info 힌트 해당 Swagger JSON 파일을 다운로드하려면 브라우저에서http://localhost:3000/api-json을 호출하면됩니다 (Swagger 설명서가 http://localhost:3000/api에 게시된 경우). ).
Body, query, path parameters
정의된 컨트롤러를 검사하는 동안 SwaggerModule은 경로 핸들러에서 사용된 @Body(), @Query() 및 @Param()데코레이터를 모두 찾습니다. 따라서 유효한 문서를 만들 수 있습니다.
또한 이 모듈은 리플렉션을 활용하여 모델 정의를 만듭니다. 다음 코드를 살펴보십시오.
warning 알림 본문 정의를 암시적으로 설정하려면 @ApiImplicitBody() 데코레이터 (@nestjs/swagger 패키지)를 사용할 수 있습니다.
CreateCatDto를 기반으로 모듈 정의가 생성됩니다 :
보시다시피 클래스에 선언된 속성이 몇 개 있지만 정의가 비어 있습니다. 클래스 속성이 SwaggerModule에 액세스할 수 있도록 하려면, @ApiModelProperty() 데코레이터로 모든 속성을 표시해야 합니다.
브라우저를 열고 생성 된 CreateCatDto 모델을 확인하십시오 :
@ApiModelProperty() 데코레이터는 옵션 객체를 받습니다 :
warning 힌트{{"@ApiModelProperty({ required: false })"}}를 계속 입력하지 않도록 하는@ApiModelPropertyOptional()단축 데코레이터가 있습니다.
덕분에 default 값을 간단히 설정하고 속성이 필요한지 여부를 결정하거나 유형을 명시적으로 설정할 수 있습니다.
Multiple specifications
Swagger 모듈은 또한 여러 사양을 지원하는 방법을 제공합니다. 즉, 엔드 포인트마다 다른 SwaggerUI를 사용하여 다른 문서를 제공할 수 있습니다.
SwaggerModule이 다중 사양을 지원할 수 있도록 하려면 응용 프로그램을 모듈 방식으로 작성해야 합니다. createDocument()메소드는 세 번째 인수인 extraOptions를 사용합니다. extraOptions는 include 속성이 모듈 배열을 필요로 하는 객체입니다.
warning 알림DocumentBuilder로 SwaggerOptions를 생성하고 새로 생성 된 options에 대해 createDocument()를 실행한 다음 두 번째 SwaggerOptions에 대한 작업을 시작하기 전에 setup()을 사용하여 즉시 "제공"해야 합니다. 두 번째 Swagger 사양의 경우. 이 특정 순서는 Swagger 구성이 다른 옵션으로 대체되지 않도록하기위한 것입니다.
import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { ApplicationModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(ApplicationModule);
/**
* createDocument(application, configurationOptions, extraOptions);
*
* createDocument method takes in an optional 3rd argument "extraOptions"
* which is an object with "include" property where you can pass an Array
* of Modules that you want to include in that Swagger Specification
* E.g: CatsModule and DogsModule will have two separate Swagger Specifications which
* will be exposed on two different SwaggerUI with two different endpoints.
*/
const options = new DocumentBuilder()
.setTitle('Cats example')
.setDescription('The cats API description')
.setVersion('1.0')
.addTag('cats')
.build();
const catDocument = SwaggerModule.createDocument(app, options, {
include: [CatsModule],
});
SwaggerModule.setup('api/cats', app, catDocument);
const secondOptions = new DocumentBuilder()
.setTitle('Dogs example')
.setDescription('The dogs API description')
.setVersion('1.0')
.addTag('dogs')
.build();
const dogDocument = SwaggerModule.createDocument(app, secondOptions, {
include: [DogsModule],
});
SwaggerModule.setup('api/dogs', app, dogDocument);
await app.listen(3000);
}
bootstrap();
@ApiUseTags('cats')
@Controller('cats')
export class CatsController {}
@Post()
@ApiResponse({ status: 201, description: 'The record has been successfully created.'})
@ApiResponse({ status: 403, description: 'Forbidden.'})
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@Post()
@ApiCreatedResponse({ description: 'The record has been successfully created.'})
@ApiForbiddenResponse({ description: 'Forbidden.'})
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@ApiUseTags('cats')
@ApiBearerAuth()
@Controller('cats')
export class CatsController {}