NestJS勉強中
色々ありまして、NestJSを学び始めた。なかなか良さげな雰囲気もあり、そのアウトプットとして本記事を作成しました。
こちらのNestJS、Node.JSをベースとしたサーバーサイドフレームワークであり、更にTypeScriptをフルサポートしています。
そのため、型安全なコードを書くことができ、更にモジュール構造や依存性の注入等の特徴を持っています。
Jestというテストフレームワークもデフォルトでサポートしており、ユニットテスト等も簡単に書くことができるということで、非常に良さげなものです。
まずは簡単な実行環境を作りつつ、私なりに説明したいと思います。
準備
まず必要なものですが、先ほどお話しした通り、NestJSはNode.jsをベースとしていますのでNode.jsのインストールが必要です。
更にはnpmというパッケージマネージャ、つまり、必要なライブラリやツールをインストールしてくれるものが必要になりますが、npmはNode.jsに同梱されているのでNode.jsのみインストールすれば良いです。
以下のURLから最新(LTSの)のバージョンをダウンロード・インストールしてください。
この記事を書いた2024/11/24であればv22.11.0が最新です。
Node.js — Run JavaScript Everywhere
NestJSの基本構成
構成上このタイミングで基本構成を説明しますが、この後説明するサンプルプロジェクトの作成後、もう一度こちらを読んでもらうと良いかもしれません。
色々なNestJSの資料を読む限りでは以下の図が一番わかりやすいかなと思います。
①main.ts:NestJSアプリケーションのエントリーポイント。ここから処理が始まります
②app.module.ts:NestJSアプリケーションのルートモジュールであり、アプリケーション全体の構成を定義するファイル。モジュールが追加される場合、ここに追加されます。
③~⑤:あとは各モジュールごとにモジュール、サービス、コントローラの3つで構成され、モジュールを追加するごとにこれらのファイルが作られます。「app.~.ts」もモジュール、サービス、コントローラの3つで構成されています
サービスはビジネスロジックを担当し、コントローラはクライアントからのリクエストを受け取ってサービスを呼び出し、レスポンスを返します。このように、サービスとコントローラは連携してアプリケーションの機能を実現します。
と、私を含むNestJS初心者の方々にはこのタイミングで書いても「なるほど」としか言えないと思いますので、繰り返しになりますが、以下のサンプルプロジェクトを作成し、動作確認を行ったところでもう一度読み返してみてください。恐らく納得いただけるのではと思います。
あとはミドルウェア(Middleware)、デコレーター(Decorators)といったものも基本構成として挙げられるようなのですが、まずはモジュール、サービス、コントローラの3つを押さえておくのがよいのではないでしょうか。
サンプルプロジェクトの作成
では、次に実際にサンプルプロジェクトを作成し、動作させてみましょう。
NestJSにおける「Hello World」です。
nestjstestというプロジェクトを作って、それをローカル環境とします
まずはプロジェクト作成。
「npm i -g @nestjs/cli」でNestJSのCLI(コマンドラインツール)をインストールします。
そして、プロジェクト作成のため、「nest new」の後にプロジェクト名を入力します。今回は「nestjstest」というプロジェクト名にします。
$ npm i -g @nestjs/cli
$ nest new nestjstest
パッケージを聞かれるのでnpmを選択します。
? Which package manager would you ❤️ to use? (Use arrow keys)
❯ npm
yarn
pnpm
しばらく進捗状況が作成された後に「Successfully created project nestjstest」というメッセージが表示されたら、プロジェクトが作成できたことになります。
そのプロジェクト直下のディレクトリに移動しましょう。
cd nestjstest
Swaggerのインストールのため、プロジェクトまで移動したら、ターミナルで以下コマンドを入力
npm install --save @nestjs/swagger
main.tsをテキストエディタで開くと以下のようになっています。
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
最初のimport文に以下の行を追加して、
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
bootstrap()内のconst app~とawait app.listenの行の間に以下のコードを書き加えてください。
const config = new DocumentBuilder()
.setTitle('(APIのタイトルを入力)')
.setDescription('(APIの説明を記載')
.setVersion('1.0')
.addTag('(タグ名。省略可)')
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document);
そして実行します。実行するときは以下のコマンドを叩いてください。
npm run start
特にエラーが出ないようであれば(入力待ちのような状態になるはず)、以下にアクセスしてみてください。
http://localhost:3000/api
Swaggerの画面が表示されるはずです。
Swaggerでも確認はできますが、以下のURLを叩けば、
http://localhost:3000/
以下のように文字列が返される(ブラウザ上に表示される)はずです。
テスト実行
ここまでは他の方もブログで説明しているので今回私なりの情報としてもう少し別のことも書いてみます。
最初に「テストフレームワークもデフォルトでサポート」と書きましたのでそれについて説明して終わりとします。
main.ts等が配置されているsrcディレクトリを見ると、通常のモジュールやサービスのファイル以外に「app.controller.spec.ts」というファイルがあります。この「~.spec.ts」というファイルがテスト用ファイルになりまして、以下の場合ですとコントローラ用のテストファイルが自動的に作成されていることになります。
ファイルの中身は以下のようになっておりまして、自動的に作成されたgetHolloを検証するコードが既に書かれております。
テストを行うにはJestというJavaScriptのテストフレームワークが必要ですが、恐らくNode.jsのインストールで併せて入っていると思います(入っていなかったらごめんなさい。。)。
実行するには対象のプロジェクト内で「rpm run test」を実行します。
すると配下の「~.spec.ts」ファイルに対してその中に書かれたテストプログラムを一通り実行します。
もし特定のファイルのみテストしたい場合は「npm run test」の後に「~.spec.ts」ファイル名を指定します。
今回は既にテストコードが書かれているのですぐに試すことができますので是非実行してみてください。
その結果が以下になります(ディレクトリ名が違うのはご容赦を)。
無事「pass」していることがわかります。
ちなみに言わずもがなかもですが、テストコードの内容については今回はサンプルプロジェクトなので既に書かれていましたが、通常は枠組みのみなので実際のテストコードは自分たちで書く必要があります。
いかがでしょうか。結構至れり尽くせりなフレームワークかと思われます。
最後に(NestJSのデメリットも含)
以上、色々とNestJS万歳的な感じで書いてきましたが、当然デメリットもあります。色々言語仕様を知り尽くせばもっと出てくるかもですが、パッと思いつくのは以下のようなものです。
・学習コストの高さ
NestJSを学ぶ前にTypeScriptやNode.jsの知識が必要になります
・情報が少ない
まだ比較的新しめのフレームワークなので情報が、特に日本語の情報が少ないので学習がやや大変
・コミュニティが小規模
国内外でNestJSの普及や紹介をしてくれているところはあるのですが、これも上に書いた通り新しめのフレームワーク故に十分にサポートが受けられない可能性があります
とはいえ、非常に魅力的かつ可能性を秘めたものではありますので、今のうちにキャッチアップしておくことは、特にNode.jsを知っている方々にとっては非常におススメできます。
また近々、NestJSに関する記事を書きますのでよろしくお願いいたします。