開発覚書はてな版

個人的な開発関連の備忘録

【NestJS】NestJSでOpenAPI(Swagger)形式で出力

概要

NestJSではOpenAPI(Swagger)形式でAPIドキュメントを出力できます。 以下のドキュメントを参考に設定をしていけばドキュメント出力が可能です。

docs.nestjs.com

OpenAPIに出力したい内容がデコレータで定義できるので、APIドキュメントと実際のAPIの差が無くなりやすくなります。

設定方法

  • @nestjs/swaggerswagger-ui-express をパッケージに追加。
  • SwaggerModuleDocumentBuilder を使用してAPIドキュメントの出力設定をする。
  • ApiModelProperty デコレータなどを使用してAPIに出力する内容を記載していく。

サンプル

実行環境

  • Node.js - 10.x
  • Yarn - 1.13.x

使用ライブラリ

  • @nestjs/common - 6.0.x
  • @nestjs/core - 6.0.x
  • @nestjs/platform-express - 6.0.x
  • @nestjs/swagger - 3.0.x
  • swagger-ui-express - 4.0.x
  • typescript - 3.2.x

src/main.ts

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

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // Swagger用の定義を設定
  const options = new DocumentBuilder()
    .setTitle('Swagger example')
    .setDescription('The API description')
    .setVersion('1.0')
    .addTag('test')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('api', app, document);

  await app.listen(3000);
}
bootstrap();

src/app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

src/dto.ts

import { ApiModelProperty } from '@nestjs/swagger';

export class HogeDto {
  @ApiModelProperty({ description: 'id' })
  id: string;

  @ApiModelProperty()
  name: string;
}

src/app.controller.ts

import { Controller, Get, Param } from '@nestjs/common';
import { ApiResponse, ApiUseTags } from '@nestjs/swagger';
import { HogeDto } from './dto';

@ApiUseTags('sample')
@Controller()
export class AppController {
  @Get('hoge/:id')
  @ApiResponse({ status: 200, type: HogeDto })
  findOne(@Param('id') id: string): HogeDto {
    return {
      id,
      name: 'aaa',
    } as HogeDto;
}

実行

yarn start で実行します。

実行結果

APIドキュメント

http://localhost:3000/api にブラウザでアクセスします。

f:id:kakkoya:20190512173240p:plain

定義ファイル

http://localhost:3000/api-json にブラウザでアクセスするとJSON形式の定義ファイルが取得できます。

f:id:kakkoya:20190512173924p:plain

サンプルソース一式

github.com

おわりに

  • デコレータと初期設定箇所のみでAPIドキュメント出力が可能なため、コストをかけず導入できるのが良いです。
  • デコレータがなくてもURLのエンドポイントなどの定義出力が可能です。
  • API定義のドキュメントと実際のAPIの差異がなくなるので、ドキュメントのメンテナンスコストが軽減される。
  • Responseでエラー系定義が多い場合は、デコレータ設定が多重になるので可読性が落ちるかもしれません。開発時のルール決めが必要です。
  • 定義をJSON形式で出力できるので、他部門・会社に提供するのも楽。

関連記事

NestJS

kakkoyakakko2.hatenablog.com