✅ Nest의 미들웨어란?
- 미들웨어는 라우터 핸들러 이전에 호출되는 함수
- 클라이언트의 요청을 라우터 핸들러가 받기전에 가로채 다른 작업을 처리할 수 있다
-> 공통적으로 처리해야하는 부분들의 처리를 중복없이 개발 가능
- 쿠키파싱, 세션관리, 인증, 본문 파싱 등등
✅ 미들웨어 사용법
@Injectable 데코레이터 사용
NestMiddleware 인터페이스 implements 해서 사용
Module의 class 내부에 configure를 사용해 선언. 이때 NestModuel 인터페이스를 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();
}
}
// app.module.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { LoggerMiddleware } from './logger/logger.middleware';
import { UsersModule } from './users/users.module';
@Module({
imports: [UsersModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer): any {
consumer
.apply(LoggerMiddleware)
.forRoutes('/users');
}
}
/user로 접속하면 'Request...' 출력되는 것 확인할 수 있음!
밑에 코드처럼 라우트 특정해 사용 가능
.forRoutes({ path: 'users', method: RequestMethod.GET });
✅ Middleware 관리를 위한 내장 모듈 - MiddlewareConsumer
- 이전 코드에서 confiure 메서드에 인자로 전달된 MiddlewareConsumer 객체를 이용해서 미들웨어를 어디에 적용할 지 관리할 수 있다
- 여러 스타일로 미들웨어 설정
# 예외처리
// 라우트 제외 가능
consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
.forRoutes(CatsController);
✅ Functional Middleware
// logger.middleware.ts
import { Request, Response, NextFunction } from 'express';
export function logger(req: Request, res: Response, next: NextFunction) {
console.log(`Request...`);
next();
};
Module에 logger function 적용하기
// app.module.ts
consumer
.apply(logger)
.forRoutes(CatsController);
✅ Middleware 전역으로 적용하기
- 특정 모듈에 미들웨어 적용이 아닌 모든 모듈에 적용하려면 main.ts를 수정해야함
- NestFactory.create로 만든 app은 INestApplication 타입을 가지고 있는데, 여기에 정의된 use() 메서드를 사용해 미들웨어 설정
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
'Node.js > Nest.js' 카테고리의 다른 글
[NestJS] 회원가입 기능 구현 (0) | 2022.10.11 |
---|---|
[NestJS] NestJS, TypeORM, MySQL에 연결하기 (0) | 2022.10.10 |
[NestJS] Controller에서 Request를 받는 방법 (0) | 2022.10.09 |
[NestJS] NestJS 로직 흐름 / Module, Controller, Service 자동 생성 (0) | 2022.10.09 |
[NestJS] NestJS 소개 / 설치 (0) | 2022.10.03 |