일반적으로 미들웨어는 라우트 핸들러가 요청을 처리하기 전에 수행되는 컴포넌트를 뜻한다.
물론 응답을 클라이언트에 보내기 전에 처리 할 수도 있다.
next()
를 호출하여 다음 미들웨어에게 제어권을 전달한다.요청-주기를 끝낸다는 말은 next()
를 통해 응답 또는 요청을 처리해야 한다는 뜻이다.
만약 미들웨어에서 제어권을 넘기지 않고 끝낼경우 Hanging상태가 된다.
미들웨어를 통해선 주로 다음과 같은 작업을 한다.
위 작업말고도 필요한게 있다면 직접구현해보면 된다.
미들웨어는 함수로 작성하거나 NestMiddleware 인터페이스를 구현한 클래스로 작성이 가능하다.
예제
import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log('req:', req);
console.log('res:', req);
next();
}
}
정말 간단한 형태의 미들웨어이다.
이제 등록을 해보자.
app.module.ts
...
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('account');
}
}
/account로 시작하는 라우터에서 LoggerMiddleware를 적용했다.
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
.forRoutes({ path: 'account', method: RequestMethod.GET });
}
}
forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.exclude({ path: 'cats', method: RequestMethod.GET }, { path: 'cats', method: RequestMethod.POST }, 'cats/(.*)')
.forRoutes(CatsController)
}
}
제외하고 싶은 경로가 있다면 위 처럼 exclude를 사용하면된다.
consumer.apply(cors, helmet, logger).forRoutes(CatsController);
main.ts
import { logger3 } from './logger3/logger3.middleware';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(logger3);
await app.listen(3000);
}
bootstrap();
부트스트랩단에서 app.use
로 등록만해주면된다.
지금까지 만든 라우터론 미들웨어로 크게 뭐 해볼게없다
다음 챕터인 Guard에서 요청을 라우터에 보내기전에 인증/인가하는 미들웨어를 만들어볼것이다.