Nest.js - 미들웨어
미들웨어
미들웨어는 라우트 핸들러전에 호출되는 함수입니다 . 미들웨어 기능은 요청 및 응답 개체에 대한 액세스 권한이 next()있으며 애플리케이션의 요청-응답 주기에 있는 미들웨어 기능입니다. 다음 미들웨어 기능은 일반적으로 라는 변수로 표시 됩니다
미들웨어 기능은 다음 작업을 수행할 수 있습니다.
- 모든 코드를 실행합니다.
- 요청 및 응답 개체를 변경합니다.
- 요청-응답 주기를 종료합니다.
- 스택의 다음 미들웨어 함수를 호출합니다.
- 현재 미들웨어 함수가 요청-응답 주기를 종료하지 않으면 next()다음 미들웨어 함수에 제어를 전달하기 위해 호출해야 합니다. 그렇지 않으면 요청이 중단됩니다.
다음 명령어를 통해 미들웨어를 생성 할 수 있다.
nest g middleware -name
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
private logger = new Logger('HTTP');
use(req: Request, res: Response, next: NextFunction) {
res.on('finish', () => {
this.logger.log(
`${req.ip} ${req.method} ${res.statusCode}`,
req.originalUrl,
);
});
next();
}
}
간단한 log를 만들었다. 이후 적용하려면
미들웨어 적용
@Module()데코레이터 에는 미들웨어가 들어갈 자리가 없습니다 . configure()대신 모듈 클래스의 메서드를 사용하여 설정합니다 . 미들웨어를 포함하는 모듈은 NestModule인터페이스를 구현해야 합니다. LoggerMiddleware수준 에서 설정합시다 AppModule.
@Module({
imports: [CatsModule],
controllers: [AppController], // 주입 받은 객체
providers: [AppService], //주입할 객체
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}
라우트 와일드카드
패턴 기반 경로도 지원됩니다. 예를 들어 별표는 와일드카드 로 사용되며 모든 문자 조합과 일치합니다.
forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });
'ab*cd'경로 경로는 , abcd, ab_cd등과 일치합니다 abecd. ?, +, *, 및 문자 ()는 경로 경로에서 사용될 수 있으며 정규 표현식 대응의 하위 집합입니다. 하이픈( -)과 점( .)은 문자 그대로 문자열 기반 경로로 해석됩니다.
미들웨어 소비자
MiddlewareConsumer도우미 클래스입니다 . 미들웨어를 관리하는 몇 가지 기본 제공 방법을 제공합니다. 그들 모두는 단순히 유창한 스타일 로 연결될 수 있습니다 . 이 메서드는 단일 문자열, 여러 문자열, 개체, 컨트롤러 클래스 및 여러 컨트롤러 클래스를 사용할 수 있습니다. 대부분의 경우 쉼표로 구분된 컨트롤러 목록을 전달할 것입니다 . 다음은 단일 컨트롤러의 예입니다.
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes(CatsController);
}
경로 제외
때때로 우리 는 미들웨어가 적용되는 특정 경로 를 제외 하고 싶을 때가 있습니다.exclude()메서드 를 사용하여 특정 경로를 쉽게 제외할 수 있습니다 . RouteInfo이 메서드는 아래와 같이 제외할 경로를 식별 하는 단일 문자열, 여러 문자열 또는 개체를 사용할 수 있습니다.
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
.forRoutes(CatsController);