jiko21’s techblog

NestJSのSwagger

TD;DR

  1. NestJSにSwaggerを導入するのは@nestjs/swaggerだけで可能
  2. ただ、@Bodyで指定したResponseBodyはSwaggerに出てこないよ

はじめに

久しぶりにNestJSを触りました。

NestJSとは、Angularに着想を得たNode.jsのサーバサイドフレームワークです。

NestJSってなんぞや?

Node.jsのフレームワークでは、王道のexpresskoa、Ruby on RailsにインスパイアされたSails.js (内部的にexpressを呼んでる) が有名かと思います。

多くのNode.jsフレームワークが小~中規模向けだと思いますが、 このNestJSは大規模な開発に向いたフレームワークと言えます。

というのも、NestJSは、

  1. TypeScriptを最初からサポート
  2. TypeORMRxJSなどのNestJS向けのmoduleが公式出て依拠されている
  3. モジュールと言う単位でのコンポーネントの管理、DIが行える

などの特性があるからです。

TypeScriptを最初からサポート

に関しては、Node.jsでサーバーサイド開発を行った方にはわかりやすいと思いますが、 型注釈が提供されることで、 型によるバグや補完機能による開発スピードのアップが期待されます。

TypeORMRxJSなどのNestJS向けのmoduleが公式出て依拠されている

に関しては、開発者が使うであろうライブラリを使いやすくした形でmoduleとして提供しています。

例えば、TypeORMなどが使いたい場合は、

@nestjs/typeorm

を追加するだけでデータベースによる永続化層をかんたんに導入できます。 (更にいうと、Repositoryパターンを容易に採用できます。)

モジュールと言う単位でのコンポーネントの管理、DIが行える

に関しては、controllerやservice層といったものをmoduleというもので管理することで、 DIなどが実現でき、テストの作成も容易となります。(詳しくは割愛します)

早速swaggerを導入する。

なんと、公式ドキュメントの記事にものっていて、 これだけでSwaggerが導入できました。

注意点

入れたらわかるのですが、エンドポイントのpathのパラメータは Swaggerに取り込まれるものの、Request Bodyは反映されません。

なんでや、となりましたが、とあるissueのコメントを見ると...

TypeScriptの性質上、無理。ジェネリクスのメタデータを利用することは現時点でむりぽ

とのことです。(テキトーに和訳しました) ぴえん。


まとめ

Swagger完全導入は言語仕様の壁もあって無理なところもありますが、 単純なドキュメントを残したい場合などには便利かな、と思いました。

ということでNestJS使おうぜ。

about author...

Frontend engineer.
loves: TypeScript, React, Node.js

more detail...