03. middleware

유현준·2022년 8월 15일
0

hello! Nest

목록 보기
3/17

middleware 구현/적용 방식

  • nest는 모든 것이 '모듈'로 정의되어 있기 때문에, 생성한 미들웨어는 다음과 같은 방식으로 app에 적용시킨다.
// 로깅 미들웨어
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  // nest는 로깅 시, nest에서 제공하는 Logger class를 이용.
  // res.on('finish') => respsonse가 완료된 이후에 로깅 실행
  private logger = new Logger('HTTP');
  use(req: Request, res: Response, next: NextFunction) {
    res.on('finish', () => {
      this.logger.log(
        `${req.originalUrl} ${req.method}, ${res.statusCode} : ${req.ip}`,
      );
    });
    next();
  }
}

// 로깅 미들웨어 전역 적용(app.module.ts)

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
import { LoggerMiddleware } from './logger.middleware';

@Module({
  imports: [CatsModule],
  controllers: [AppController],
  providers: [AppService],
})
// middleware 적용
// Appmodule이란 클래스 안에 미들웨어를 바운딩할 대상에 apply한다.
// implements: NestModule의 interface에 충족하도록 제한
// forRoutes는 미들웨어를 바인딩시키는 라우터. '*'를 입력하면 전체 라우터에 바인딩.
// consumer는 미들웨어를 제공하는 대상
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('*');
  }
}

참고강의

profile
차가운에스프레소의 개발블로그입니다. (22.03. ~ 22.12.)

0개의 댓글