미들웨어는 클라이언트 사이드에서 요청한 Http Request 에서 Router Handler 로 가기 전에 기능을 공통화 하여 사용하거나 처리하게 할 수 있는데 그 이후 next 라는 함수를 호출해서 다음 작업이 진행 될 수 있게 합니다.
클라이언트로 부터 들어온 Request 에서 Response 과정의 전체 라이프 사이클에서 next 라는 함수를 통해 특정 함수를 실행하고 처리할 수 있습니다.
우선 Middleware를 만들기 위해 NestMiddleware 코드를 보겠습니다.
export interface NestMiddleware<TRequest = any, TResponse = any> {
use(req: TRequest, res: TResponse, next: () => void): any;
}
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(req.ip);
next();
}
}
NestMiddleware 를 implements 하여 정의된 use 함수를 LoggerMiddleware 에서 구현했습니다.
위의 미들웨어의 기능으로 단순하게 console.log 를 통해 어떤식으로 작동이 되는지 로그를 찍었고 use 함수의 첫 번째 파라미터인 any 타입으로 된 req 객체를 로깅해보는 역할이며,
req 는 HttpRequest 타입으로 정의할 수 있습니다.
로깅을 한 이후에 next() 를 하지 않는다면 Response 가 되지 않는 상태로 아마 클라이언트 쪽에서는 타임아웃이 발생할 때까지 hang이 걸릴 것입니다.
LoggerMiddleware 를 Injectable 데코레이터로 디펜던시로 사용하고 LoggerMiddleware 를 아래 AppModule 에서 NestModule 을 implement 하여 configure 를 통해 MiddlewareConsumer 객체를 통해 apply 시키도록 하겠습니다.
export class AppModule {
configure(consumer: MiddlewareConsumer): any {
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}
이런식으로 모든 api에 로그를 보여줄 수 있다.
export class AppModule {
configure(consumer: MiddlewareConsumer): any {
consumer
**.exclude({path:'user/list', method:RequestMethod.GET})**
.apply(LoggerMiddleware)
.forRoutes('*');
}
}
exclude를 사용해서 특정 api를 제외하고 로그를 남겨줄수 있다.