Dev Study
NestJS コース

15. ミドルウェア — ルーティング前の共通処理

ミドルウェアは、どのハンドラが処理するか決まるより前にリクエストへ触れる部品です。NestMiddleware の use(req, res, next) を実装し、最後に next() を呼んで処理を先へ渡します。適用はモジュールの configure() で、どのパスに効かせるかを指定します。

Express と同じ仕組みなので、アクセスログの記録や CORS、リクエスト ID の付与など、Express 用の既存ミドルウェア資産をそのまま流用したい場面でよく使います。アプリの最前段で全リクエストに一律で効かせたい処理に向いています。

最大のつまずきポイントは next() の呼び忘れです。next() を呼ばないと処理がそこで止まり、クライアントは応答のないまま待ち続けます。ミドルウェアを書いたら「next() か明示的なレスポンスのどちらかで必ず終わる」ことを確認しましょう。

サンプルコード(フレームワーク環境が必要なため表示のみ)

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

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(req.method + " " + req.originalUrl);
    next(); // 呼び忘れると処理が止まる
  }
}

@Module({})
export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes("users");
  }
}
公式ドキュメントで詳しく ↗