高瀬博道の技術ブログ

高瀬博道の技術ブログです。

もう2023年になるので、今さらNestJSに入門しようと思う - その1

こんにちは。高瀬です。

ずっとやろうやろうと思っていたのですが、そろそろ2023年になってしまうので、重い腰を上げて、いい加減にNestJSに入門しようと思います。

公式サイト nestjs.com

NestJSについて

フロントエンドのAngularに大きく影響を受けたバックエンド用Node.js/TypeScriptのフレームワークです。

セットアップ

$ npm i -g @nestjs/cli
$ nest new project-name

実行すると、npm/yarn/pnpmが選択できます。

インストールが完了すると、いろいろなファイル群が作成されています。

node_modules/
src/
test/
.eslintrc.js
.gitignore
.prettierrc
nest-cli.json
package-lock.json
package.json
README.md
tsconfig.build.json
tsconfig.json

srcの中には、以下のファイル群が格納されています。

app.controller.spec.ts
app.controller.ts
app.module.ts
app.service.ts
main.ts

それぞれの役割は以下のようです。

  • app.controller.spec.ts
    • コントローラの単体テスト
  • app.controller.ts
    • コントローラ
  • app.module.ts
    • ルートモジュール
  • app.service.ts
    • サービスクラス
  • main.ts
    • Nestアプリケーションインスタンスを作成するエントリファイル

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();

エントリファイルでNestのアプリケーションインスタンスを作成するには、まずNestFactory.create()を利用するみたいですね。それで、この関数の利用にはモジュールを引数に渡す必要があるようです。

その後、app.listen()で、3000ポートをリッスンしています。

main.tsは、srcの中に入れておけば、npm startとかを実行すれば、main.tsから読み込んでくれそうですね。

それでは、モジュールとはなんでしょうか。

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

モジュールは、クラスのようですね。export class AppModule {}が本体でしょう。

その上に、@Module()デコレータがついています。

@Module()デコレータは、Nestがアプリケーション構造を理解するために使用されるメタデータを提供するようです。

@Module()デコレータに設定できるもの
  • providers
    • Nestインジェクタによってインスタンス化され、少なくともこのモジュール全体で共有される可能性があるプロバイダ
  • controllers
    • インスタンス化する必要がある、このモジュールで定義されたコントローラのセット
  • imports
    • このモジュールで必要なプロバイダをエクスポートする、インポートされたモジュールのリスト
  • exports
    • このモジュールによって提供され、このモジュールをインポートする他のモジュールで使用できるプロバイダのサブセットで、プロバイダ自体またはそのトークンのみを使用できる

まとめ

ここまでで、

  • npm startsrc/main.tsが呼ばれる
  • src/main.tsは、NestFactory.create()の実行に、モジュール (ルートモジュール)が必要
  • モジュールは、controllerとserviceを紐づけている

ことがわかりました。

次回は、モジュールをもっと掘り下げようと思います。

takasehiromichiex.com