【NestJS入門シリーズ】第3章: NestJSのルーティングとミドルウェア

第3章NestJSのルーティングとミドルウェア TypeScript
PR

1. ルーティングとは

ルーティングは、HTTPリクエストを受け取り、それに対して適切なコントローラーのメソッドを呼び出すための仕組みです。NestJSでは、デコレーターを使ってルーティングを簡単に設定することができます。ここでは、基本的なルーティングの使い方と、パラメータ、クエリ、ボディを扱う方法について解説します。

2. 基本的なルーティングの設定

NestJSでは、コントローラーを使ってルーティングを定義します。以下に、簡単なユーザー関連のAPIを作成するためのコードを示します。

2.1 コントローラーの作成

まず、ユーザー関連のコントローラーを作成します。src/user.controller.tsというファイルを新規作成します。

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

@Controller('users')
export class UserController {
private users = [];

@Post()
create(@Body() user: { name: string; age: number }) {
this.users.push(user);
return user;
}

@Get()
findAll() {
return this.users;
}

@Get(':id')
findOne(@Param('id') id: string) {
return this.users[id];
}
}

このコードでは、以下のエンドポイントを作成しています。

  • POST /users: 新しいユーザーを作成するエンドポイント。
  • GET /users: すべてのユーザーを取得するエンドポイント。
  • GET /users/:id: 特定のIDのユーザーを取得するエンドポイント。

2.2 サービスの作成

次に、ビジネスロジックを分離するためのサービスを作成します。ファイル名はsrc/user.service.tsとします。

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

@Injectable()
export class UserService {
private users = [];

create(user: { name: string; age: number }) {
this.users.push(user);
return user;
}

findAll() {
return this.users;
}

findOne(id: number) {
return this.users[id];
}
}

このサービスは、ユーザーの作成、取得を担当します。

2.3 モジュールへの登録

最後に、コントローラーとサービスをアプリケーションのメインモジュールに登録します。src/app.module.tsを編集します。

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

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

3. アプリケーションの再起動

アプリケーションを再起動します。ターミナルで以下のコマンドを実行してください。

npm run start

4. APIのテスト

4.1 Postmanを使ったテスト

APIが正常に動作しているかを確認するために、Postmanを使ってテストします。

  1. ユーザーの作成: POST /usersエンドポイントに対して以下のJSONデータを送信します。jsonコードをコピーする{ "name": "John Doe", "age": 30 }
  2. すべてのユーザーを取得: GET /usersエンドポイントにアクセスすると、作成したユーザーのリストが取得できます。
  3. 特定のユーザーを取得: GET /users/0エンドポイントにアクセスすると、IDが0のユーザーが取得できます。

5. ルーティングの詳細

NestJSでは、ルーティングの設定に多くのオプションがあります。以下にいくつかの重要なデコレーターとその使用例を示します。

5.1 デコレーターの種類

  • @Get(): GETリクエストを処理するメソッド。
  • @Post(): POSTリクエストを処理するメソッド。
  • @Put(): PUTリクエストを処理するメソッド。
  • @Delete(): DELETEリクエストを処理するメソッド。
  • @Patch(): PATCHリクエストを処理するメソッド。
  • @Param(): URLパラメータを取得するデコレーター。
  • @Body(): リクエストボディを取得するデコレーター。
  • @Query(): クエリパラメータを取得するデコレーター。

5.2 ルートパラメータの取得

ルートパラメータは、エンドポイントの一部として指定される値です。以下は、IDをパラメータとして受け取る方法の例です。

@Get(':id')
findOne(@Param('id') id: string) {
return this.users[id];
}

5.3 クエリパラメータの取得

クエリパラメータは、URLの末尾に?key=valueという形式で追加される値です。以下は、クエリパラメータを取得する方法の例です。

@Get()
findAll(@Query('page') page: number) {
// ページネーション処理を行うことができる
return this.users.slice(page * 10, (page + 1) * 10);
}

6. ミドルウェアの利用

ミドルウェアは、リクエストがルーティングハンドラーに到達する前に実行される関数です。これにより、リクエストの処理を拡張したり、カスタムロジックを追加したりすることができます。

6.1 ミドルウェアの作成

ミドルウェアを作成するために、src/logger.middleware.tsというファイルを作成します。

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(`Request... ${req.method} ${req.originalUrl}`);
next();
}
}

このミドルウェアは、リクエストメソッドとURLをログに出力します。

6.2 ミドルウェアの登録

作成したミドルウェアをアプリケーションに登録します。src/app.module.tsを以下のように変更します。

import { Module, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { LoggerMiddleware } from './logger.middleware';

@Module({
imports: [],
controllers: [AppController, UserController],
providers: [AppService, UserService],
})
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}

これにより、すべてのリクエストに対してLoggerMiddlewareが適用されます。

7. まとめ

この第3章では、NestJSのルーティングとミドルウェアについて詳しく解説しました。基本的なルーティングの設定、パラメータやクエリの取得方法、ミドルウェアの作成と登録方法を学びました。