Nest.js - Middleware

김세겸·2023년 2월 28일
0

NestJS

목록 보기
8/18
post-thumbnail

1. 미들웨어 란?

라우트 핸들러가 클라이언트 요청을 처리하기 전에 수행되는 컴포넌트.

  • Nest 미들웨어는 기본적으로 express 미들웨어와 동일합니다.
  • 모든 코드를 실행합니다.
  • 요청 및 응답 객체를 변경합니다.
  • 요청-응답 주기를 종료합니다.
  • 스택에서 다음 미들웨어 함수를 호출합니다.
  • 현재 미들웨어 기능이 요청-응답 주기를 종료하지 않으면 next()다음 미들웨어 기능으로 제어를 전달하도록 호출해야 합니다. 그렇지 않으면 요청이 중단됩니다.

2. 미들웨어 사용법

미들웨어는 함수 또는 @Injectable() 데코레이터가 있고 NestMiddleware 인터페이스를 구현한 클래스로 작성 가능하다.

1. logger middleware

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

@Injectable() 데코레이터를 사용하므로 의존성 주입이 가능하다.

2. 미들웨어 적용

// app.module.ts
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware) // 위에서 작성한 미들웨어 적용 
      .forRoutes('cats'); // 특정 라우트에만 지정, 와이들카드 사용가능
  }
}

3. 특정 라우트 제외

consumer
  .apply(LoggerMiddleware)
  .exclude(
    { path: 'cats', method: RequestMethod.GET },
    { path: 'cats', method: RequestMethod.POST },
    'cats/(.*)',
  )
  .forRoutes(CatsController);

consumer에 exclude를 활용하여 특정 라우트는 제외하고 사용 할 수 있다.

4. 함수형 미들웨어

import { Request, Response, NextFunction } from 'express';

export function logger(req: Request, res: Response, next: NextFunction) {
  console.log(`Request...`);
  next();
};

함수로 만든 미들웨어의 단점은 DI 컨테이너를 사용 할 수 없다는 것이다.

0개의 댓글