高瀬博道の技術ブログ

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

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

前回

takasehiromichiex.com

モジュールについて

まずモジュールは、main.tsのbootstrapで、NestFactory.create(AppModule)で、ルートモジュールとして利用します。

機能モジュール

特定の機能に関連するコードを整理し、明確な境界を確立するようです。

CLIを使用してモジュールを作成してみます。

$ nest g module cats

以下のファイルが作成されました。

src/cats/cats.module.ts
import { Module } from '@nestjs/common';

@Module({})
export class CatsModule {}

必要最低限のモジュールが作成されたようです。

機能モジュールとして機能させるために、コントローラとサービスも作成してみます。

コントローラの作成

CLIを使用してコントローラを作成します。

$ nest g controller cats

以下のファイルが作成されました。

src/cats/cats.controller.ts
import { Controller } from '@nestjs/common';

@Controller('cats')
export class CatsController {}
src/cats/cats.controller.spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { CatsController } from './cats.controller';

describe('CatsController', () => {
  let controller: CatsController;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [CatsController],
    }).compile();

    controller = module.get<CatsController>(CatsController);
  });

  it('should be defined', () => {
    expect(controller).toBeDefined();
  });
});

また、src/cats/cats.module.tsも自動的に更新されたようです。

src/cats/cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';

@Module({
  controllers: [CatsController]
})
export class CatsModule {}

コントローラがモジュールに自動的に追加されています。

サービスも作成してみましょう。

サービスの作成

サービスは、プロバイダの一種です。

プロバイダには、サービス、リポジトリ、ファクトリ、ヘルパーなどがあります。

CLIを使用してサービスを作成します。

$ nest g service cats

以下のファイルが作成されました。

src/cats/cats.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class CatsService {}
src/cats/cats.service.spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { CatsService } from './cats.service';

describe('CatsService', () => {
  let service: CatsService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [CatsService],
    }).compile();

    service = module.get<CatsService>(CatsService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });
});

また、src/cats/cats.module.tsも自動的に更新されたようです。

src/cats/cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService]
})
export class CatsModule {}

サービスがモジュールに自動的に追加されています。

ルートモジュール

ルートモジュールも自動的に更新されるようです。

src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';

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

作成したモジュールが、importsとしてルートモジュールに追加されています。

まとめ

ここまでで、

  • CLIを使用した機能モジュールの作成
  • CLIを使用したコントローラの作成
  • CLIを使用したサービスの作成

を行いました。

次回は、コントローラをもっと掘り下げようと思います。

コード

現時点のコードは以下に格納しました。

github.com

takasehiromichiex.com