- 요청 가공: 요청 객체를 수정하거나 필요한 데이터를 추가.
- 인증/인가: JWT 토큰 확인, 사용자 권한 검사 등.
- 로깅: 요청 정보를 기록.
- 에러 처리: 에러가 발생하면 응답을 조기에 종료.
Middleware
의 기능중 로깅 미들웨어를 구현해보자!
logger.middleware.ts
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) {
const { method, url } = req;
const timestamp = new Date().toISOString();
console.log(`[${timestamp}] ${method} ${url}`); // 요청 정보 로깅
next(); // 다음 미들웨어 또는 컨트롤러로 요청 전달
}
}
NestMiddlware
를 implements해서use
를 꼭 구현해야한다.Request
를 이용해서method
정보와url
정보를 가져온다.next
를 호출해서 로직을 수행하고 다음으로 넘긴다.@Injectable
을 꼭 해서 Inject 해줘야 한다.
app.module.ts
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.exclude(
{
path: 'auth/login',
method: RequestMethod.POST,
},
{
path: 'auth/register',
method: RequestMethod.POST,
},
)
.forRoutes('*');
}
}
- 위의 예시처럼
AppModule
에 적용하면Global
하게 모든 요청에 적용할 수 있고,exclude
를 사용해서 특정 라우트 요청에만 적용시킬 수 있다.
main.ts
import { LoggerMiddleware } from './middlewares/logger.middleware';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(new LoggerMiddleware().use); // 글로벌 미들웨어 적용
await app.listen(3000);
}
bootstrap();
main.ts
에 미들웨어를 달면Global
하게 모든 요청에 적용 시킬 수 있다!