NestJSのSwagger
TD;DR
- NestJSにSwaggerを導入するのは@nestjs/swaggerだけで可能
- ただ、@Bodyで指定したResponseBodyはSwaggerに出てこないよ
はじめに
久しぶりにNestJSを触りました。
NestJSとは、Angularに着想を得たNode.jsのサーバサイドフレームワークです。
NestJSってなんぞや?
Node.jsのフレームワークでは、王道のexpressやkoa、Ruby on RailsにインスパイアされたSails.js (内部的にexpressを呼んでる) が有名かと思います。
多くのNode.jsフレームワークが小~中規模向けだと思いますが、 このNestJSは大規模な開発に向いたフレームワークと言えます。
というのも、NestJSは、
- TypeScriptを最初からサポート
- TypeORMやRxJSなどのNestJS向けのmoduleが公式出て依拠されている
- モジュールと言う単位でのコンポーネントの管理、DIが行える
などの特性があるからです。
TypeScriptを最初からサポート
に関しては、Node.jsでサーバーサイド開発を行った方にはわかりやすいと思いますが、 型注釈が提供されることで、 型によるバグや補完機能による開発スピードのアップが期待されます。
TypeORMやRxJSなどのNestJS向けのmoduleが公式出て依拠されている
に関しては、開発者が使うであろうライブラリを使いやすくした形でmoduleとして提供しています。
例えば、TypeORMなどが使いたい場合は、
@nestjs/typeorm
を追加するだけでデータベースによる永続化層をかんたんに導入できます。 (更にいうと、Repositoryパターンを容易に採用できます。)
モジュールと言う単位でのコンポーネントの管理、DIが行える
に関しては、controllerやservice層といったものをmoduleというもので管理することで、 DIなどが実現でき、テストの作成も容易となります。(詳しくは割愛します)
早速swaggerを導入する。
なんと、公式ドキュメントの記事にものっていて、 これだけでSwaggerが導入できました。
注意点
入れたらわかるのですが、エンドポイントのpathのパラメータは Swaggerに取り込まれるものの、Request Bodyは反映されません。
なんでや、となりましたが、とあるissueのコメントを見ると...
TypeScriptの性質上、無理。ジェネリクスのメタデータを利用することは現時点でむりぽ
とのことです。(テキトーに和訳しました) ぴえん。
まとめ
Swagger完全導入は言語仕様の壁もあって無理なところもありますが、 単純なドキュメントを残したい場合などには便利かな、と思いました。
ということでNestJS使おうぜ。