未経験からのNestJS入門|コントローラー

コントローラーとは

コントローラーの役割は、アプリケーションに対するリクエストを受信して処理を実行することです。

コントローラーはルーティングを設定し、そのルーティングごとに適切な処理を実行します。

また環境構築が完了している前提ですので、『未経験からの NestJS 入門|環境構築』を参考に環境を構築してください。

CLI でコントローラーを作成

Nest.js には、CLI を使ったコントローラーの作成方法がおすすめです。

以下 CLI コマンドを実行してください。

nest g co users

上記のコマンドを実行すると、以下のように users コントローラーに必要なファイルが作成されます。

src/
└── users/
    ├── users.controller.spec.ts
    └── users.controller.ts

users.controller.ts は、作成された users コントローラーの実装を記述するファイルであり、users.controller.spec.ts は、テストファイルです。

次に、app.module.ts にコントローラーを追加しましょう。app.module.ts は、Nest.js アプリケーションのメインモジュールであり、各種設定を行います。

// /src/app.module.ts

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

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

上記の例では、AppModule に AppController と UsersController を追加しています。ここで、controllers プロパティは、アプリケーションに存在するコントローラーの一覧を指定するものであり、AppService は、アプリケーションに存在するサービスの一覧を指定するものです。

これで users のルーティングコントローラーが作成されました。

ルーティングコントローラーは@nestjs/common パッケージの@Controller デコレーターを定義することで、作成できます。

オプションでルートパスフィックスなどを指定し、アクセスパスに応じてコントローラーが処理を受けつけます。

コントローラーの編集

次に、作成した users コントローラーの実装を変更して、レスポンスを返すようにしてみましょう。

前回作成した user.controller.ts を以下のように修正してください。

// /src/users/users.controller.ts

import { Controller, Get } from '@nestjs/common';

@Controller('users')
export class UsersController {
  @Get()
  getUsers(): string {
    return 'This is the response from the UsersController';
  }
}

試しに、http://localhost:3000/users にアクセスしてください。レスポンスが帰ってきます。

上記の例では、@Get デコレーターを使って、GET リクエストをハンドリングするメソッドを定義しています。ここでは、単純に文字列を返していますが、実際のアプリケーションでは、データベースからデータを取得したり、外部 API にアクセスしてデータを取得したりすることが一般的です。

Service の呼び出し

前項でコントローラーは作成しました。

ですが通常、コントローラーの機能を定義するときにこのような直書きは好ましくなく、サービスと呼ばれる単位で機能を作成しコントローラーから呼び出します。

試しに、もうすでにある app.service を使い、users コントローラーに追加してみましょう。 本来は、app.service に記述するのではなく、users.service に記述するのが好ましいですが、今回はコントローラーの理解に重点を置くため、無視します。

// /src/app.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getUsers(): string {
    return 'ユーザー情報を取得しました';
  }
}
// /src/users/users.controller.ts

import { Controller, Get } from '@nestjs/common';
import { AppService } from '../app.service';

@Controller('users')
export class UsersController {
  constructor(private readonly appService: AppService) {}

  @Get()
  async getUsers(): Promise<string> {
    const users = await this.appService.getUsers();
    return users;
  }
}

試しに、http://localhost:3000/users にアクセスしてください。レスポンスが帰ってきます。

ここでは、AppService クラスの getUsers メソッドを呼び出し、その結果を Promise オブジェクトとして返す getUsers メソッドを定義しています。

また、async/await を使って非同期処理を行っていることに注意してください。

最後に

以上で、Nest.js におけるコントローラーの作成とサービスの利用方法について学びました。コントローラーとサービスをうまく組み合わせることで、Nest.js を使ったアプリケーションの開発がスムーズに進むようになるでしょう。

次に『未経験からの NestJS 入門|サービス』からサービスの新規作成の方法も学びましょう。