MiddleWare
란 Controller
바로 전에 동작하는 함수다.
response
와 request
개체와 next()
를 이용할 수 있다.
이 기능들은 응용프로그램의 요청 및 응답과 다음 미들웨어 함수를 next()
에 담아 손쉽게 사용할 수 있게해준다.
자세하게 설명하진 않겠지만, express의 MiddleWare
와 같기때문에 이해가 안간다면 express를 공부하는 것도 추천한다.
우선, src
안에 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) {
console.log('Request...');
next();
}
}
위 코드를 보면 확인할 수 있는 점이, MiddleWare
를 만들 때, class
로 만들 경구, NestMiddleware
를 implements
해줘야한다.
이게 가능하다면 항상 constructor
를 이용하여 만들 수 있습니다.
@Module
데코레이터에는 MiddleWare
를 못넣으니, Module
에서 configure
메서드를 만들어서 사용할 수 있다.
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 });
}
}
forRoutes
를 이용하여 path
를 지정한 후, method
까지 정해줄 수 있습니다. 그리고 위 코드에선 적용되지 않았지만, configure
은 비동기 처리를 할 수 있습니다.
와일드카드?라는 말을 처음 들어보고 이해를 못했지만, 계속 읽어보니 이해가됐다.
path
를 path: 'ab*cd'
이렇게 지정해준다면 abcd
,ab_cd
,abecd
등 가운데가 비어있든, 특수문자, 문자 아무거나 들어가도 위 path
에 들어가지는 개념입니다.
헬퍼클래스로, 몇 가지 내장된 미들웨어를 관리해주는 메서드를 가지고있습니다. 이 메서드들은 간단하게 연결할 수 있습니다.
forRoutes()
메서드는 하나의 문자열, 다수의 문자열을, RouteInfo
객체는 컨트롤러 클래스, 심지어 다수의 컨트롤러 클래스들을 받을 수 있습니다. 쉼표로 구분하여 전달합니다.
의존성이 없는 MiddleWare
의 경우, 함수형으로 간단하게 만들 수 있는데,
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();
}
}
이런 코드를
export function logger(req, res, next) {
console.log(`Request...`);
next();
}
이렇게 바꿀 수 있습니다.
의존성이 없다면 이렇게 바꾸는 것이 좋습니다
여러 미들웨어를 바인딩할 때 콤마로 구분하여 리스트를 제공해주면된다.
아래는 apply()
를 이용한 방법입니다.
consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);