Middleware

이재홍·2022년 5월 19일
0

네스트의 미들웨어는 기본적으로 익스프레스와 동일하다.

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class Logger2Middleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log('Request2...');
    next(); // 요청을 받아 작업을 수행 후 next로 다음 미들웨어 또는 라우트핸들러로 넘어갈 수 있다. next를 해주지않고 에러처리나 응답을 보내주며 끝내는것도 가능하다.
  }
}

미들웨어를 적용하기 위해서는 NestModule 인터페이스를 구현해야 한다.

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer): any {
    consumer
      .apply(LoggerMiddleware, Logger2Middleware) // 함수나 클래스를 인자로 받을 수 있고 적용된 미들웨어는 앞에서부터 순차적으로 실행된다.
      .exclude({ path: 'users', method: RequestMethod.GET },) // 적용에서 제외할 수 있다(경로,메서드 해당 경우에 미들웨어 무시)
      .forRoutes(UsersController) // 적용할 해당 요청경로 설정(문자열로 넣어줄수도있고 클래스를 넣어줄수도있어 보통 컨트롤러 클래스를 넣어준다.)
  }
}

특정 모듈단위가 아닌 전역으로 미들웨어를 적용하고싶다면
main.ts에서 app.use를 사용한다.
다만 app.use()는 클래스를 인자로 받을 수 없기에 미들웨어는 함수로 정의해야한다.

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

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

함수로 만든 미들웨어는 프로바이더를 주입받아 사용할 수가 없다.

import { logger3 } from './logger3/logger3.middleware';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(logger3);
  await app.listen(3000);
}
bootstrap();

0개의 댓글