ミドルウェアの作成と活用する方法

NestJSでのミドルウェアの作成と活用について学びましょう。

概要

NestJSでは、ミドルウェアはリクエストとレスポンスの間で動作し、特定の処理を行うための関数です。ミドルウェアは、リクエストの解析、レスポンスヘッダーの追加、不正アクセスの禁止など、様々な目的で使用されます。この記事では、NestJSでミドルウェアを作成し、それを活用する方法を具体的なコード例とともに解説します。

nest.js v10.1.7
nodejs v19.7.0

また、今回作成するコードは全て、GitHubに掲載しています。

ミドルウェアを作成する方法

まず、NestJSのCLIを使用して新しいミドルウェアを作成します。以下のコマンドを実行して、loggerという名前のミドルウェアを作成します。

nest g mi users/middleware/logger

このコマンドを実行すると、logger.middleware.tsというファイルがusers/middlewareディレクトリ内に作成されます。このファイルは、新しく作成されたミドルウェアの実装を行う場所です。

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

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    console.log("Request received at " + new Date());
    next();
  }
}

上記のコードでは、ミドルウェアがリクエストを受け取るたびに、現在の日時とともに"Request received"というメッセージをコンソールに出力します。

ミドルウェアを適用する方法

次に、作成したミドルウェアをNestJSアプリケーションに適用します。これは、アプリケーションのモジュールであるusers.module.tsファイルで行います。

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { LoggerMiddleware } from './middleware/logger/logger.middleware';

@Module({
  imports: [],
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('*');
  }
}

上記のコードでは、LoggerMiddlewareが全てのルート(*)に対して適用されます。これにより、アプリケーションが受け取る全てのリクエストに対して、LoggerMiddlewareが動作します。

テスト

以下のコマンドを実行して、ミドルウェアが正しく動作していることを確認しましょう。各コマンドを実行すると、コンソールに"Request received"というメッセージとともに現在の日時が出力されます。

# ユーザー一覧の取得
curl http://localhost:3000/users
# ユーザーの追加
curl -X POST -H "Content-Type: application/json" -d '{"name":"Mike"}' http://localhost:3000/users
# ユーザーの更新
curl -X PUT -H "Content-Type: application/json" -d '{"name": "Bob"}' http://localhost:3000/users/1
# ユーザーの削除
curl -X DELETE http://localhost:3000/users/4

まとめ

この記事では、NestJSでミドルウェアを作成し

、それをアプリケーションに適用する方法を解説しました。ミドルウェアは、リクエストとレスポンスの間で動作し、特定の処理を行うための重要な概念です。NestJSを使ったアプリケーション開発において、ミドルウェアの作成と活用は必須のスキルとなります。