라우트 핸들러가 클라이언트 요청을 처리하기 전에 수행되는 컴포넌트.
- Nest 미들웨어는 기본적으로 express 미들웨어와 동일합니다.
- 모든 코드를 실행합니다.
- 요청 및 응답 객체를 변경합니다.
- 요청-응답 주기를 종료합니다.
- 스택에서 다음 미들웨어 함수를 호출합니다.
- 현재 미들웨어 기능이 요청-응답 주기를 종료하지 않으면 next()다음 미들웨어 기능으로 제어를 전달하도록 호출해야 합니다. 그렇지 않으면 요청이 중단됩니다.
미들웨어는 함수 또는 @Injectable() 데코레이터가 있고 NestMiddleware 인터페이스를 구현한 클래스로 작성 가능하다.
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) {
console.log('Request...');
next();
}
}
@Injectable() 데코레이터를 사용하므로 의존성 주입이 가능하다.
// app.module.ts
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('cats'); // 특정 라우트에만 지정, 와이들카드 사용가능
}
}
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
.forRoutes(CatsController);
consumer에 exclude를 활용하여 특정 라우트는 제외하고 사용 할 수 있다.
import { Request, Response, NextFunction } from 'express';
export function logger(req: Request, res: Response, next: NextFunction) {
console.log(`Request...`);
next();
};
함수로 만든 미들웨어의 단점은 DI 컨테이너를 사용 할 수 없다는 것이다.