본문 바로가기

Nestjs

Middleware

미들웨어는 라우트 핸들러 전에 호출되는 함수

 

함수 또는 @Injectable()데코레이터가있는 클래스에서 사용자 정의 Nest 미들웨어를 구현.

클래스는 NestMiddleware인터페이스를 구현해야 하지만 함수에는 특별한 요구 사항이 없다.

클래스를 사용하여 간단한 미들웨어 기능을 구현하는 것으로 시작.

logger.middleware.ts

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: Function) {
    console.log('Request...');
    next();
  }
}

app.module.ts

import { Module, NestModule, RequestMethod, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes({ path: 'cats', method: RequestMethod.GET });
  }
}

Route wildcards

forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });

Middleware consumer

종종 미들웨어가 적용되지 않도록 특정 경로 를 제외 하고 싶을 때

consumer
  .apply(LoggerMiddleware)
  .exclude(
    { path: 'cats', method: RequestMethod.GET },
    { path: 'cats', method: RequestMethod.POST }
  )
  .forRoutes(CatsController);

Functional middleware

logger.middleware.ts

export function logger(req, res, next) {
  console.log(`Request...`);
  next();
};

app.module.ts

consumer
  .apply(logger)
  .forRoutes(CatsController);

미들웨어에 종속성이 필요하지 않을 때는 언제든지 간단한 기능의 미들웨어 대안을 사용.


Multiple middleware

consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);

Global middleware

const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);

'Nestjs' 카테고리의 다른 글

Guards  (0) 2019.11.05
Pipes  (0) 2019.11.05
Modules  (0) 2019.11.05
Providers  (0) 2019.11.05
Controller  (0) 2019.11.05