미들웨어

유석현(SeokHyun Yu)·2022년 12월 22일
0

Nest.js

목록 보기
6/9
post-thumbnail
post-custom-banner

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 에서 NestModuleimplements 해야한다.

그 다음, 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,
    });
  }
}
profile
Backend Engineer
post-custom-banner

0개의 댓글