NestJS Interceptorについて



NestJSのInterceptorを理解するために、この文章を書きます.
Nestの公式文書では、Interceptorは@Injectable()と注釈されたクラスです.最近の受信者インタフェースを実装する必要があります.
Interceptorは,視点向けプログラミング(AOP)技術からインスピレーションを得て生まれた多様な機能を持つ優れた集合である.受信者:
  • メソッドは、前/後バインドの異なる論理
  • を実行する.
    変換
  • 関数が返す値
  • 変換
  • 関数放出の異常
  • ベース関数を拡張する機能
  • 特定の条件下で関数
  • を完全に上書き
    と記述する.
    コードから見ると
    import {
        CallHandler,
        ExecutionContext,
        Injectable,
        NestInterceptor,
    } from '@nestjs/common';
    import { Observable, map } from 'rxjs';
    
    @Injectable()
    export class UndefinedToNullInterceptor implements NestInterceptor {
        intercept(
            context: ExecutionContext,
            next: CallHandler<any>,
        ): Observable<any> | Promise<Observable<any>> {
            //Controller 가기 전 부분
            return (
                next
                    .handle()
                    //handle()다음부분은 Controller 실행되고 난 후 부분
                    .pipe(map((data) => (data === undefined ? null : data)))
            );
        }
    }
    
    上のコードを見て、Interceptorとして指定されたクラスはImplementsを行う必要があります.
    Interceptorには2つのパラメータのブロック方法が含まれています.
    最初のパラメータcontextは多くの機能を提供します.
    2番目のパラメータCallHandlerは、ルーティングハンドラメソッドを呼び出す際に使用されるhandle()メソッドを含む.
    戻る前にコードを挿入すると、コントローラに入る前にデータを操作して変換できます.
    handle()メソッドの後に実行される部分は、コントローラが実行する部分データを操作および変換することができる.
    上のコードは、データが定義されていない場合にnullに変更したり、直接データを送信したりするコードです.
    受信機は主に最後にデータを再加工するために使用される.
    pipeにはErrorも含まれています.ExceptionFilterで理解してみましょう.
    import {
        Body,
        Controller,
        Get,
        HttpException,
        Post,
        Req,
        Res,
        UseInterceptors,
    } from '@nestjs/common';
    import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
    import { User } from 'src/common/decorator/user.decorator';
    import { UserDto } from 'src/common/dto/user.dto';
    import { UndefinedToNullInterceptor } from 'src/common/interceptors/undefinedToNull.interceptor';
    import { JoinRequestsDto } from './dto/join.request.dto';
    import { UsersService } from './users.service';
    
    @UseInterceptors(UndefinedToNullInterceptor)
    @ApiTags('USER')
    @Controller('api/users')
    export class UsersController {
        constructor(private usersService: UsersService) {}
    	
      	//@UseInterceptors(UndefinedToNullInterceptor) 개별 Route Interceptor
        @ApiResponse({
            type: UserDto,
        })
        @ApiOperation({ summary: '내 정보 조회' })
        @Get()
        getUsers(@User() user) {
            return user;
        }
    
        
        }
    アクセプタは取り付ける必要があります.コントローラに@UseInterceptors()個のディスプレイを取り付けるだけでいいです.
    コントローラ全体に適用したり、単一のルータに適用したりできます.