Tunko Development Diary

[NestJS]Middleware 생성 및 사용 본문

Development/Nest.js

[NestJS]Middleware 생성 및 사용

Tunko 2021. 5. 3. 17:36

Documentation | NestJS - A progressive Node.js framework

NestJS 의 Middleware 는 Express 의 형태와 동일하다.

Middleware 의 기능

  • 모든 코드에서 실행이 가능하다.
  • Request , Response 를 변경할 수 있다.
  • Request , Response 를 종료할 수 있다.
  • 다음 Middleware를 호출한다.
  • 종료하지 않는 경우 다음 Middleware 를 nest() 를 호출해 실행한다.

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

미들웨어 클래스에선 NestMiddleware 를 인터페이스로 사용해야 된다.
그리고 NestMiddleware 내부의 정의된 use 함수를 정의 해주어야 한다.

@Injectable() 를 통해서 Dependency injection이 가능하도록한다. 이는 모든 모듈에서 사용이 가능하도록 하기위함이다.

특정 모듈에서 Middleware 클래스 사용

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes({ path: 'cats', method: RequestMethod.GET });
  }
}

AppModule 에서 사용한 형태이며
NestModule 을 인터페이스로 선언하고
configure(consumer: MiddlewareConsumer) 함수를 구현해준다.
내부의 forRoutes 를 통해 특정 라우터와 메소드 형태에서만 반응할 수 있는 미들웨어로 등록이 가능하다.

함수형 Middleware 생성

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

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

위 코드는 미들웨어 함수를 선언한것이다.
클래스로 생성했을때와 큰 차이는 NestMiddleware 인터페이스를 사용하지 않고 그냥
use 함수의 매개변수 형태를 동일하게 선언되어 있다.

함수형 Middleware 의 사용 (1)

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(logger)
      .forRoutes(/*모듈 클래스*/);
  }
}

함수형 Middleware 의 사용 (2)

const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);

글로벌로 모든 라우팅에서 생성한 logger 란 미들웨어를 사용할 수 있다.

반응형
Comments