NestJS はNode.jsでサーバーサイドアプリケーションを構築するためのフレームワークです。
mofmofではNestJSに力を入れています。
今回は、他のフレームワークでサーバーサイドアプリケーション構築経験のあるエンジニアが、NestJSに入門する際に何を知っておくべきなのか考えてみました。
まずは@Decorator
NestJSのコードで @Module
や @Controller
など、 @
のついたコードを良く見ます。
これはTypeScriptのDecorator
というものです。
簡単に言ってしまうと、対象となるクラスやメソッドを受け取って拡張する高階関数のシンタックスシュガーとも言えるものです。
それぞれのDecoratorはなんとなくの使い方はわかると思いますが、最初は魔法のように見えます。
高階関数だという前提で各種Decoratorのソースコードを読んでみると理解が深まりやすいと思いました。
NestJSの依存関係解決について
NestJSの依存関係管理の仕組みを知るには、ProviderとModuleが重要です。
NestJSではサービス、リポジトリ、ファクトリ、ヘルパーなどのクラスを Provider
と呼び、扱います。
Providerを依存関係として管理し、適切に利用できるようにするための機能がNestJSに備わっています。
Module
以下のように@Module
でデコレートされたクラスがモジュールです。
https://docs.nestjs.com/modules
import { Module } from '@nestjs/common';
import { DogsModule } from '../dogs/docs.module';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
imports: [DogsModule],
providers: [CatsService],
exports: [CatsService],
controllers: [CatsController],
})
export class CatsModule {}
Moduleにはいくつかのプロパティを渡す事ができ、とても重要。
CatsModuleについて見てみる。
imports
外部のModuleへの依存を記述する。importしたModuleのexportsに定義されたProviderがModule内で利用可能になる
providers
Moduleで利用するProviderをここへ定義する。CatsModule内でCatsサービスを利用することが可能になる
exports
CatsModuleをインポートする外部モジュールが使えるようになるProviderを定義する。
ここに記述したものが外部からこのModuleを見たときのインタフェースといえる。
controllers
ControllerはHttpリクエストを受け渡すクラスです。
ここに登録したControllerが、起動時にインスタンス化されます。
NestJSの大きな特徴である依存関係の管理周りを見てみました。
その他おさえておきたい登場人物
ミドルウェア
NestJSはhttpサーバーとしてExpressをデフォルト採用していますが、Expressの拡張を行うミドルウェアという機構と同等のものがNestJSのミドルウェアのようです。
なので、httpリクエストやレスポンスをゴニョゴニョするようなときにこれを使うのがよいのではないかと思います。
例外フィルター
未処理の例外をキャッチし、httpレスポンスに変換したりできる。
Pipe
変換と検証を行うための機構
@Get(':id')
async findOne(@Param('id', ParseIntPipe) id: number) {
return this.catsService.findOne(id);
}
ParseInt
がPipeです。この指定で、idがnumberであることが保証されます(numberでない場合は例外になる)
Guards
デコレータを用いて、認証、認可機構を実現する。
基本的にはコントローラーやコントローラーのアクションメソッドをデコレートして利用します。
Interceptor
メソッド実行の前後に余分なロジックをバインドする
メソッドから返された結果、例外を変換する
メソッドの動作を拡張する
// ロギング処理を付け加えるInterceptor
@UseInterceptors(LoggingInterceptor)
export class CatsController {}
まとめ
NestJSを学ぶ際に最初に抑えておきたい登場人物を挙げてみました。
NestJSは公式ドキュメントがしっかりあるので、そちらに目を通すと大抵のことは解決するのかなと思います。