Nest.js Interceptors


受信者には切断()方法があります.ここには2つの論点がある.

ExecutionContext

  • ArgumentHostから
  • を継承

    Call handler

  • インタフェースは、特定の時点でルーティングハンドルメソッドを呼び出す際に使用されるハンドル()メソッドを表す.
  • ハンドル()メソッドが呼び出されない限り、ルーティングハンドルメソッドは絶対に実行されません.

  • CatsControllerのCreate()HandlerにマッピングされたPOST/catsというリクエストがあります.handle()が呼び出され、Observerableが返されると、create()プロセッサがトリガーされて実行されます.handle()が実行されない場合、コントローラのメソッドは絶対に実行されません.その後、応答ストリームがObservableを受信すると、ストリーム内で他の操作を実行することができ、最終的な結果は呼び出し元に返される.

    ルータハンドルが実行される前と後に、私たちが望む論理を挿入すればいいです.
    ルータプロセッサメソッドを実行する前に処理するために、ブロック()メソッドでhandle()メソッドを呼び出す前に、私たちが望む論理を実行させることができますが、handle()の後に処理する論理はどうすればいいですか?
    handle()はobserveraleを返すので、RxJSを使用して任意に応答できます.
    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()호출 이후에 실행되는 부분
          );
      }
    }