1. Middleware
- HTTP 요청을 처리하는 과정 중간에 실행되는 기능
- 요청과 응답 객체에 접근하여 요청을 변형하거나 처리하기 전에 특정한 동작을 수행할 수 있다.
- 인증, 로깅 등을 처리할 수 있다.
- 요청과 응답 객체를 변경할 수 있다.
- 요청의 validation을 체크하여 오류 처리를 할 수 있다.
2. 사용법
- @injectable 데코레이터를 사용
- 인터페이스를 implements해서 사용한다.
- class 내부에 configure를 사용하여 선언. 이때 NestModule 인터페이스를 implements한다.
- 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();
}
}
==> NestMiddleware를 implements한다.
- app.module.ts
import { Module, NestModule, 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('cats');
}
}
==> app.module에서 configure해서 사용한다
forRoutes({ path: 'cats', method: RequestMethod.GET });
==> 특정 라우터만 사용할 수도 있다.
forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });
==> wildcard를 이용하여 특정 정규식 패턴을 적용할 수 있다.
3. MiddlewareConsumer (Middleware 관리를 위한 내장 모듈)
- 헬퍼클래스를 사용하면 여러 스타일로 미들웨어를 설정할 수 있다.
- forRoutes(): 단일 문자열, 여러 문자열, RoutesInfo 객체, 컨트롤러 클래스 및 여러 컨트롤러 클래스를 사용
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { CatsModule } from './cats/cats.module';
import { CatsController } from './cats/cats.controller';
@Module({
imports: [CatsModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes(CatsController);
}
}
==> controller를 적용한 예
- apply: 여러 미들웨어를 지정할 수 있다.
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
.forRoutes(CatsController);
==> Route 예외 처리
4. Functional middleware
- logger.middleware.ts
import { Request, Response, NextFunction } from 'express';
export function logger(req: Request, res: Response, next: NextFunction) {
console.log(`Request...`);
next();
};
==> class 대신 function 형태로 middleware를 처리
- app.module.ts
consumer
.apply(logger)
.forRoutes(CatsController);
5. Multiple middleware
consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
==> apply() 메서드에 여러개의 미들웨어를 사용할 수 있다.
6. Global middleware
- main.ts
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
==> DI 컨테이너에 액세스할 수 없다.
==> app.use에서 사용하는 middleware는 function middleware를 사용해야 한다.
'JavaScript Dev. > Nest.js' 카테고리의 다른 글
Nest.js - Guards (0) | 2024.03.12 |
---|---|
Nest.js - Provider (0) | 2024.02.28 |
Nest.js - Controller (0) | 2024.02.28 |
Nest.js - Module (0) | 2024.02.28 |
Nest.js 설치부터 기본 개념까지 (1) | 2024.02.06 |