Middleware

생성일
Dec 21, 2021 10:59 AM
태그
미들웨어는 라우트 핸들러 이전에 호출되는 함수이다.
클라이언트 → 미들웨어 → 라우트 핸들러
기본적으로 express와 동일함
 
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 데코레이터가 있는 클래스에서 커스텀 미들웨어를 구현함.
(implements- extends와 비슷하지만 반드시 부모의 메소드나 변수를 오버라이드 해서 사용해야 함.)
 
 
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');

// http method를 제한 할 수도 있다.
	configure(consumer: MiddlewareConsumer) {
	    consumer
	      .apply(LoggerMiddleware)
	      .forRoutes({ path: 'cats', method: RequestMethod.GET });
	  }
  }
}
모듈 데코레이터로 등록 못함. 왜 못하게 만들었을까? 클래스의 configure 메소드로 미들웨어를 등록하면 된다. 위의 예제는 /cats 라우트 핸들러에 로거미들웨어를 등록함.
MiddlewareConsumer는 헬퍼 클래스이다. 미들웨어를 관리하기 위한 몇가지 내장된 방법을 제공함. (ex. forRoutes)
 
consumer
  .apply(LoggerMiddleware)
  .exclude(
    { path: 'cats', method: RequestMethod.GET },
    { path: 'cats', method: RequestMethod.POST },
    'cats/(.*)',
  )
  .forRoutes(CatsController);
exclude 옵션으로 route path 제외도 가능
 
 

Fuctional middleware

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

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


// app.module.ts
consumer
  .apply(logger)
  .forRoutes(CatsController);
종속성이 필요 없다면 Injectable 없이 사용해도 됨.
 
 

미들웨어 여러개일 경우

consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
쉼표로 여러개 넘겨주면 된다.
 
 

글로벌 미들웨어

const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
nest 인스턴스의 use 메서드 사용
 
 
injectable이 필요할 경우를 잘 모르겠다.

Loading Comments...