もふもふ技術部

IT技術系mofmofメディア

NestJSを学ぼう

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は公式ドキュメントがしっかりあるので、そちらに目を通すと大抵のことは解決するのかなと思います。