Middleware

이준엽·2024년 12월 14일
  • 라우팅 핸들러에 도달하기 이전에 작동하는 로직
    • 로깅이나 요청 검증등에 이용한다.
  • 요청 Req, 응답 Res 객체에 접근 가능
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log('Request...');
    next();
  }
}
  • interceptor와의 차이 - 라우터 호출 전 로직인지 메서드 단계의 전후 로직인지
  • middleware는 주입하는 과정에서 @Module에 등록하지 않는다.
    미들웨어를 포함하는 NestModule Interface를 implement하고 module class의 configure메서드를 이용하여 미들웨어를 설정한다.
@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes('cats');
  }
}
  • 미들웨어 체이닝 가능, 특정 라우트에 적용 혹은 제외 가능, 글로벌 미들웨어는 main.ts에서 적용.
//미들웨어 체이닝
consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);

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

//글로벌 미들웨어 - main.ts
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
profile
하루하루 차근차근

0개의 댓글