[NestJS] - Middleware

morecodeplease·2024년 12월 4일
0

NestJS TIL

목록 보기
9/9
post-thumbnail

🤑 1. Middleware란?

✅ Middleware는 라우트 핸들러가 실행되기 전에 실행된다. Request와 Response 객체에 접근 할 수 있다.


주요 기능

  • 요청 가공: 요청 객체를 수정하거나 필요한 데이터를 추가.
  • 인증/인가: JWT 토큰 확인, 사용자 권한 검사 등.
  • 로깅: 요청 정보를 기록.
  • 에러 처리: 에러가 발생하면 응답을 조기에 종료.

🤡 로깅 미들웨어

Middleware의 기능중 로깅 미들웨어를 구현해보자!

사용 방법 ( 구현 )

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) {
    const { method, url } = req;
    const timestamp = new Date().toISOString();
    console.log(`[${timestamp}] ${method} ${url}`); // 요청 정보 로깅
    next(); // 다음 미들웨어 또는 컨트롤러로 요청 전달
  }
}
  • NestMiddlware를 implements해서 use를 꼭 구현해야한다.
  • Request를 이용해서 method 정보와 url 정보를 가져온다.
  • next를 호출해서 로직을 수행하고 다음으로 넘긴다.
  • @Injectable을 꼭 해서 Inject 해줘야 한다.

🙌 특정 라우트에 적용하기

app.module.ts

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .exclude(
        {
          path: 'auth/login',
          method: RequestMethod.POST,
        },
        {
          path: 'auth/register',
          method: RequestMethod.POST,
        },
      )
      .forRoutes('*');
  }
}
  • 위의 예시처럼 AppModule에 적용하면 Global하게 모든 요청에 적용할 수 있고, exclude를 사용해서 특정 라우트 요청에만 적용시킬 수 있다.

🥽 글로벌하게 적용하기

main.ts

import { LoggerMiddleware } from './middlewares/logger.middleware';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.use(new LoggerMiddleware().use); // 글로벌 미들웨어 적용
  await app.listen(3000);
}
bootstrap();
  • main.ts에 미들웨어를 달면 Global하게 모든 요청에 적용 시킬 수 있다!

참조

profile
Everyday's a lesson

0개의 댓글