- 라우팅 핸들러에 도달하기 이전에 작동하는 로직
- 요청 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);
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
.forRoutes(CatsController);
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);