네스트의 미들웨어는 기본적으로 익스프레스와 동일하다.
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class Logger2Middleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log('Request2...');
next(); // 요청을 받아 작업을 수행 후 next로 다음 미들웨어 또는 라우트핸들러로 넘어갈 수 있다. next를 해주지않고 에러처리나 응답을 보내주며 끝내는것도 가능하다.
}
}
미들웨어를 적용하기 위해서는 NestModule 인터페이스를 구현해야 한다.
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer): any {
consumer
.apply(LoggerMiddleware, Logger2Middleware) // 함수나 클래스를 인자로 받을 수 있고 적용된 미들웨어는 앞에서부터 순차적으로 실행된다.
.exclude({ path: 'users', method: RequestMethod.GET },) // 적용에서 제외할 수 있다(경로,메서드 해당 경우에 미들웨어 무시)
.forRoutes(UsersController) // 적용할 해당 요청경로 설정(문자열로 넣어줄수도있고 클래스를 넣어줄수도있어 보통 컨트롤러 클래스를 넣어준다.)
}
}
특정 모듈단위가 아닌 전역으로 미들웨어를 적용하고싶다면
main.ts에서 app.use를 사용한다.
다만 app.use()는 클래스를 인자로 받을 수 없기에 미들웨어는 함수로 정의해야한다.
import { Request, Response, NextFunction } from 'express';
export function logger3(req: Request, res: Response, next: NextFunction) {
console.log(`Request3...`);
next();
};
함수로 만든 미들웨어는 프로바이더를 주입받아 사용할 수가 없다.
import { logger3 } from './logger3/logger3.middleware';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(logger3);
await app.listen(3000);
}
bootstrap();