Development/Nest.js
[NestJS]Middleware 생성 및 사용
Tunko
2021. 5. 3. 17:36
Documentation | NestJS - A progressive Node.js framework
NestJS 의 Middleware 는 Express 의 형태와 동일하다.
Middleware 의 기능
- 모든 코드에서 실행이 가능하다.
- Request , Response 를 변경할 수 있다.
- Request , Response 를 종료할 수 있다.
- 다음 Middleware를 호출한다.
- 종료하지 않는 경우 다음 Middleware 를 nest() 를 호출해 실행한다.
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();
}
}
미들웨어 클래스에선 NestMiddleware 를 인터페이스로 사용해야 된다.
그리고 NestMiddleware 내부의 정의된 use 함수를 정의 해주어야 한다.
@Injectable() 를 통해서 Dependency injection이 가능하도록한다. 이는 모든 모듈에서 사용이 가능하도록 하기위함이다.
특정 모듈에서 Middleware 클래스 사용
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes({ path: 'cats', method: RequestMethod.GET });
}
}
AppModule 에서 사용한 형태이며
NestModule 을 인터페이스로 선언하고
configure(consumer: MiddlewareConsumer) 함수를 구현해준다.
내부의 forRoutes 를 통해 특정 라우터와 메소드 형태에서만 반응할 수 있는 미들웨어로 등록이 가능하다.
함수형 Middleware 생성
import { Request, Response, NextFunction } from 'express';
export function logger(req: Request, res: Response, next: NextFunction) {
console.log(`Request...`);
next();
};
위 코드는 미들웨어 함수를 선언한것이다.
클래스로 생성했을때와 큰 차이는 NestMiddleware 인터페이스를 사용하지 않고 그냥
use 함수의 매개변수 형태를 동일하게 선언되어 있다.
함수형 Middleware 의 사용 (1)
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(logger)
.forRoutes(/*모듈 클래스*/);
}
}
함수형 Middleware 의 사용 (2)
const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
글로벌로 모든 라우팅에서 생성한 logger 란 미들웨어를 사용할 수 있다.
반응형