メインコンテンツまでスキップ

6. Middleware

ミドルウェアの役割

ミドルウェアは、リクエストとレスポンスの間に実行される関数で、リクエストのログ記録、認証、バリデーション、キャッシュ処理などに使用されます。Nest.jsでは、Express.jsのミドルウェアをそのまま利用することができます。

基本的なミドルウェアの使用方法

新しいミドルウェアを作成するには、以下の手順に従います。

基本的なミドルウェアの作成

以下は基本的なミドルウェアの例です:

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...`);
next();
}
}

ミドルウェアの登録

作成したミドルウェアをアプリケーションに登録するには、モジュールの設定ファイルで NestModule インターフェースを実装し、configure メソッドを使用します。

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
import { CatsController } from './cats.controller';

@Module({
controllers: [CatsController],
})
export class CatsModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes(CatsController);
}
}

複数のミドルウェアの適用

複数のミドルウェアを適用する場合は、apply メソッドにミドルウェアのリストを渡します。

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
import { AuthMiddleware } from './auth.middleware';
import { CatsController } from './cats.controller';

@Module({
controllers: [CatsController],
})
export class CatsModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware, AuthMiddleware)
.forRoutes(CatsController);
}
}

ルートごとのミドルウェアの適用

特定のルートにのみミドルウェアを適用することも可能です。

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
import { CatsController } from './cats.controller';

@Module({
controllers: [CatsController],
})
export class CatsModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes({ path: 'cats', method: RequestMethod.GET });
}
}

ミドルウェアの利用例

ログミドルウェアの実装例

以下はリクエストのログを記録する基本的なログミドルウェアの例です:

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...`);
console.log(`Method: ${req.method}, URL: ${req.url}`);
next();
}
}

認証ミドルウェアの実装例

以下はユーザー認証を行う基本的な認証ミドルウェアの例です:

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

@Injectable()
export class AuthMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
const authToken = req.headers['authorization'];
if (!authToken) {
throw new UnauthorizedException('No token provided');
}
// トークンの検証ロジックを追加
next();
}
}

エラーハンドリングミドルウェアの実装例

以下はリクエストのエラーハンドリングを行う基本的なミドルウェアの例です:

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

@Injectable()
export class ErrorHandlingMiddleware implements NestMiddleware {
use(err: any, req: Request, res: Response, next: NextFunction) {
console.error(err.stack);
res.status(500).send('Something broke!');
}
}

これで、ミドルウェアの基本的な役割と使用方法について理解できました。次のセクションでは、ガードの役割と使用方法について説明します。