미들웨어는 라우트 핸들러 전에 호출되는 함수입니다. 미들웨어 함수는 애플리케이션의 request-response 사이클에서 request, response 객체, 그리고 next() 미들웨어 함수에 대한 접근을 갖습니다.
next 미들웨어 함수는 next라는 이름을 가진 변수로 흔히 표기됩니다.
Next 미들웨어는 기본적으로 express 미들웨어와 동일합니다. express 공식 문서에서는 다음과 같이 미들웨어를 설명하고 있습니다.
미들웨어 함수는 다음과 같은 작업들을 수행할 수 있다: - 어떠한 코드든 실행한다. - request와 response 객체를 수정한다. - request-response 사이클을 종료시킨다. - 스택에서 다음 미들웨어 함수를 호출한다. - 만약 가장 최근에 호출된 미들웨어 함수에서 request-response 사이클을 종료시키지 않았다면, 해당 미들웨어는 반드시 next()를 호출하여 다음 미들웨어 함수에게 제어권을 넘겨야 한다. (그렇지 않으면 request는 해결되지 않은 채로 남아있을 것이다.)
함수 또는 @Injectable() 데코레이터가 있는 클래스에서 커스텀 Next 미들에어를 구현해 봅시다. 함수는 특별한 요구 사항이 없는 반면, 클래스는 NextMiddleware 인터페이스를 구현해야 합니다. 클래스 메서드를 사용하여 간단한 미들웨어 기능을 구현할 수 있습니다.
Nest 미들웨어는 의존성 주입에 대해 완전한 지원을 하고 있습니다. provider 및 controller와 마찬가지로 동일한 모듈 내에서 사용할 수 있는 의존성을 주입할 수 있습니다. 이 작업은 일반적인 경우들과 마찬가지로 생성자를 통해 수행됩니다.
1-2. Applying middleware
@Module() 데코레이터는 미들웨어를 위한 자리가 존재하지 않습니다. 대신 모듈 클래스의 configure() 메서드를 사용하여 설정할 수 있습니다. 미들웨어를 포함하는 모듈은 NestModule 인터페이스를 구현해야 합니다. AppModule 수준에서 LoggerMiddleware를 설정해 보겠습니다.
config() 메서드는 async/await을 사용하여 비동기화할 수 있습니다(예: config() 메서드 본문 내에서 비동기 연산이 완료될 때까지 기다릴 수 있음).
WARNING express 어댑터를 사용할 때 NestJS 앱은 기본적으로 패키지 body-parser에서 json 및 urlencoded를 등록합니다. 즉, MiddlewareConsumer를 통해 해당 미들웨어를 커스텀하려면 NestFactory.create()로 애플리케이션을 생성할 때 bodyParser 플래그를 false로 설정하여 전역 미들웨어를 꺼야 합니다.
1-3. Route wildcards
패턴 기반 경로도 지원됩니다. 예를 들어 별표(*)는 와일드카드로 사용되며 어떤 문자 조합과도 일치합니다:
apply() 메서드는 단일 미들웨어를 받거나 여러 미들웨어를 지정하기 위해 여러 인수를 받을 수 있습니다.
1-5. Excluding routes
특정 라우트를 미들웨어 적용 대상에서 제외하고 싶을 때가 있을 수 있습니다. 이 때는 exclude() 메서드를 사용하면 특정 경로를 쉽게 제외할 수 있습니다. 이 메서드는 아래와 같이 제외할 라우트를 식별하는 단일 문자열, 여러 문자열 또는 RouteInfo 객체를 받을 수 있습니다: