미들웨어는 라우트 핸들러 이전에 호출되는 함수이다.
클라이언트 → 미들웨어 → 라우트 핸들러
기본적으로 express와 동일함
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 데코레이터가 있는 클래스에서 커스텀 미들웨어를 구현함.
(
implements
- extends와 비슷하지만 반드시 부모의 메소드나 변수를 오버라이드 해서 사용해야 함.)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');
// http method를 제한 할 수도 있다.
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes({ path: 'cats', method: RequestMethod.GET });
}
}
}
모듈 데코레이터로 등록 못함. 왜 못하게 만들었을까? 클래스의 configure 메소드로 미들웨어를 등록하면 된다. 위의 예제는 /cats 라우트 핸들러에 로거미들웨어를 등록함.
MiddlewareConsumer는 헬퍼 클래스이다. 미들웨어를 관리하기 위한 몇가지 내장된 방법을 제공함. (ex. forRoutes)
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
.forRoutes(CatsController);
exclude 옵션으로 route path 제외도 가능
Fuctional middleware
import { Request, Response, NextFunction } from 'express';
export function logger(req: Request, res: Response, next: NextFunction) {
console.log(`Request...`);
next();
};
// app.module.ts
consumer
.apply(logger)
.forRoutes(CatsController);
종속성이 필요 없다면 Injectable 없이 사용해도 됨.
미들웨어 여러개일 경우
consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
쉼표로 여러개 넘겨주면 된다.
글로벌 미들웨어
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
nest 인스턴스의 use 메서드 사용
injectable이 필요할 경우를 잘 모르겠다.
Loading Comments...