logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log({
message: 'LoggerMiddleware',
path: req.path,
});
next();
}
}
nest g middleware {미들웨어명}
으로 미들웨어 파일을 생성한다.
use()
안에 미들웨어로써 작동할 로직을 작성한다.
app.module.ts
import { Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
}
위에서 작성한 미들웨어를 사용하려면 AppModule 에서 NestModule 을 implements
해야한다.
그 다음, AppModule 안에 다음 코드를 작성한다.
configure(consumer: MiddlewareConsumer) {
consumer.apply().forRoutes();
}
위 코드를 그대로 작성한 후 apply()
안에는 사용할 미들웨어의 클래스명을, forRoutes()
안에는 경로를 지정하면 된다.
예를 들어 경로가 "*"
라면 모든 http 요청은 해당 미들웨어를 한 번씩 무조건 거치게 된다.
경로가 "cats"
라면 경로가 "http://localhost:8000/cats"
로 시작하는 요청에 대해서만 해당 미들웨어를 거치게 된다.
위에서 생성한 "LoggerMiddleware"
를 모든 요청에 대해 적용해보자.
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { LoggerMiddleware } from 'src/logger/logger.middleware';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}
forRoutes()
안에는 경로를 지정할 수도 있지만, 경로와 함께 http 메서드도 지정해줄 수 있다.
사용방법은 forRoutes() 안에 객체 하나를 인자로 넘겨주는데, 객체의 path
에 경로를 지정하고 method
에는 http 메서드 종류를 지정하면 된다.
import {
MiddlewareConsumer,
Module,
NestModule,
RequestMethod,
} from '@nestjs/common';
import { LoggerMiddleware } from 'src/logger/logger.middleware';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes({
path: 'cats',
method: RequestMethod.GET,
});
}
}