개발 공부/NestJS
미들웨어 Middleware
게으른 제이
2023. 3. 19. 09:16
미들웨어는 라우터 핸들러보다 먼저 호출되는 함수, express의 middleware와 동작이 동일하다.
미들웨어 함수는 일반적으로 다음 작업들을 수행할 수 있다.
- 모든 코드 실행
- 요청(Request) 및 응답(Response) 객체 변경
- 요청-응답 주기를 종료
- 현재 미들웨어에서 요청-응답 주기를 종료하지 않으면 next 함수를 이용해 다음 미들웨어로 제어를 전달하도록 해야한다.
기본 로거 구현 해보기
함수나 @Injectable() 데코레이터가 존재하는 클래스로 구현해야 한다. 해당 클래스는 NestMiddleware를 구현해야 한다.
nest cli를 사용해 logger middleware를 생성한다.
$ nest g mi logger
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
private logger = new Logger('HTTP');
use(req: Request, res: Response, next: NextFunction) {
res.on('finish', () => {
this.logger.log(
`${req.ip} ${req.method} ${res.statusCode} ${req.originalUrl}`,
);
});
next();
}
}
응답 객체의 on 메소드에 finish 이벤트를 넣어주어 응답이 완료 되었을 때 콜백 함수가 작동하도록 하였다.
미들웨어 적용
Module() 데코레이터에는 미들웨어가 들어갈 자리가 없다. 대신 모듈 클래스의 configure() 메서드를 사용하여 설정한다.
미들웨어를 포함하는 모듈은 NestModule 인터페이스를 구현 해야한다.
본인은 AppModule 레벨에서 LoggerMiddleware를 설정했다.
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('*');
}
}
특정 메소드의 요청일 때만 미들웨어 적용하기
import { Module, NestModule, RequestMethod, 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({ path: 'cats', method: RequestMethod.GET });
}
}
더 자세한 내용이 알고 싶다면 공식문서를 추천한다.
https://docs.nestjs.com/middleware