Nest.js Interceptors

adam2·2021년 8월 6일
0

Interceptor들은 intercept()메소들을 가지고 있다. 여기에는 두개의 argument가 존재한다.

ExecutionContext

  • ArgumentHost에서 상속

Call handler

  • 인터셉터에서 특정 시점에 라우트 핸들러 메소드를 호출할 때 사용하는 handle()메소드를 impl한다.
    • handle()메소드를 호출하지않으면 라우트 핸들러 메소드는 절대 실행되지 않는다.

예시

POST /cats 라는 리퀘스트가 있고, 이 리퀘스트는 CatsController의 create()핸들러에 매핑이 되어있다고 하자. handle()이 호출되고 Observable이 리턴되면, create()핸들러는 그제서야 트리거 되서 실행된다. handle()이 실행되지 않으면 컨트롤러의 메소드는 절대 실행되지 않는 것이다. 그리고 response 스트림이 Observable에 수신되면 스트림에서 추가 작업을 수행할 수 있으며 최종 결과는 caller에게 리턴된다.

라우터 핸들러가 실행되지 전과 후에 우리가 원하는 로직을 집어넣으면 된다.
라우터 핸들러 메소드 실행 전에 처리하기 위해서는 intercept()메소드 안에서 handle()메소드를 호출하기 전에 우리가 원하는 로직을 실행시켜주면 되지만, handle() 이후에 처리해야하는 로직은 어떻게 해야할까?
handle()은 Observale을 리턴하기 때문에 RxJS를 이용해서 response를 맘대로 할 수 있다.

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    // handler()호출 전에 실행되는 부분
    console.log('Before...');

    const now = Date.now();
    return next
      .handle()
      .pipe(
        tap(() => console.log(`After... ${Date.now() - now}ms`)),// handler()호출 이후에 실행되는 부분
      );
  }
}

0개의 댓글