미들웨어는 라우트 핸들러 전에 호출되는 함수
함수 또는 @Injectable()
데코레이터가있는 클래스에서 사용자 정의 Nest 미들웨어를 구현.
클래스는 NestMiddleware인터페이스
를 구현해야 하지만 함수에는 특별한 요구 사항이 없다.
클래스를 사용하여 간단한 미들웨어 기능을 구현하는 것으로 시작.
logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: Function) {
console.log('Request...');
next();
}
}
app.module.ts
import { Module, NestModule, RequestMethod, 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({ path: 'cats', method: RequestMethod.GET });
}
}
Route wildcards
forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });
Middleware consumer
종종 미들웨어가 적용되지 않도록 특정 경로 를 제외 하고 싶을 때
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST }
)
.forRoutes(CatsController);
Functional middleware
logger.middleware.ts
export function logger(req, res, next) {
console.log(`Request...`);
next();
};
app.module.ts
consumer
.apply(logger)
.forRoutes(CatsController);
미들웨어에 종속성이 필요하지 않을 때는 언제든지 간단한 기능의 미들웨어 대안을 사용.
Multiple middleware
consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
Global middleware
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);