nestjs에서 이상 필터 Exceptionfilter의 구체적인 사용

Nestjs의 이상 필터에 대해서는 언급하지 않을 수 없습니다.Net의 전역 필터 Filter는 기능이 상당히 강하다. 이론적으로 말하면 AOP가 절단면을 향해 프로그래밍을 하는 것은 이상 처리를 필요로 하는 장면이 너무 많다고 할 수 있다.Nestjs의 이상 필터로 돌아가서 비슷한 기능을 실현하고 비슷한 처리 방식을 사용합니다. 단지 C#, Nodejs를 향한 것입니다. 영광스럽게도 저는 두 프레임워크에서 비슷한 것을 찾았습니다.
절단면 프로그래밍 AOP는 프로그래밍 규범과 유사한 동쪽이다. 동문 형제는 인터페이스 프로그래밍, SOLID 원칙 등이 있다.

Nestjs 예외 처리


기본 예외 처리


Nestjs에는 Httpexception으로 변환할 수 있는 기본 전역 이상 필터가 내장되어 있습니다.
Httpexception 또는 하위 클래스 예외의 경우 이 예외의 JSON 형식이 반환됩니다.

{"exceptionCode":40005,"message":" ","path":"/"}
Httpexception 또는 하위 클래스 예외가 아닌 경우 다음과 같이 반환됩니다.

{"statusCode":500,"message":"Internal server error"}
Nestjs는 내장된 기본 이상 처리를 사용하기 때문에 포획되지 않은 이상으로 인해 프로그램이 붕괴되지 않습니다.

사용자 정의 이상 필터 처리


내장된 이상 처리 반환값 형식을 조정할 수 없기 때문에 사용자 정의 이상은 정상적으로 보입니다.사용자 정의 이상은 이상 정보를 되돌려 사용자 정의를 할 수 있고 사용자 정의 이상 인코딩을 증가시켜 클라이언트 직원들이 이상 인코딩에 따라 다른 전시를 할 수 있도록 한다.
어떻게 이상을 사용자 정의합니까?
반복적으로 바퀴를 만들지 않는 것은 프로그래머의 자아 구속이다. 우선 우리는 우리의 이상한 기류를 새로 만든다.

import { HttpException } from "@nestjs/common";

/**
 *  
 *
 * @export
 * @class BaseException
 * @extends {HttpException}
 */
export class BaseException extends HttpException {

  /**
   * Creates an instance of BaseException.
   * @param {number} exceptionCode  
   * @param {string} errorMessage  
   * @param {number} statusCode  
   * @memberof BaseException
   */
  constructor(public exceptionCode: number, public errorMessage: string, public statusCode: number) {
    super({ exceptionCode: exceptionCode, errorMessage: errorMessage }, statusCode);
  }

  /**
   *  
   *
   * @return {*}
   * @memberof BaseException
   */
  getExceptionCode(): number {
    return this.exceptionCode;
  }

  getErrorMessage(): string {
    return this.errorMessage;
  }

  getStatusCode(): number {
    return this.statusCode;
  }
}
그리고 사용자 정의 이상 코드가 추가된 권한이 부여되지 않은 이상 유형을 새로 만듭니다.

import { HttpStatus } from "@nestjs/common";
import { BaseException } from "./base.exception";

export class UnCauhtException extends BaseException {
  constructor() {
    super(40000, " , !", HttpStatus.FORBIDDEN);
  }
}

사용자 정의 이상을 설정하면 권한이 부여되지 않은 이상을 처리해야 합니다. 우선 사용자 정의 이상 처리 기본 클래스를 새로 만듭니다. 여기서 우리가 사용하는 일을 주의하십시오. Express:

import { ArgumentsHost, ExceptionFilter, HttpException } from "@nestjs/common";
import { HttpArgumentsHost } from "@nestjs/common/interfaces";
import { BaseException } from "src/exceptions/base.exception";
import { Response, Request } from "express";

/**
 *  
 *
 * @export
 * @class BaseExceptionFilter
 * @implements {ExceptionFilter<BaseException>}
 */
export abstract class BaseExceptionFilter implements ExceptionFilter<BaseException>
{
  /**
   *  
   *
   * @abstract
   * @param {BaseException} exception
   * @param {ArgumentsHost} host
   * @memberof BaseExceptionFilter
   */
  abstract catch(exception: BaseException, host: ArgumentsHost);

  /**
   *  http 
   *
   * @protected
   * @param {ArgumentsHost} host
   * @return {*}
   * @memberof BaseExceptionFilter
   */
  protected getHttpContext(host: ArgumentsHost) {
    return host.switchToHttp();
  }

  /**
   *  http  
   *
   * @protected
   * @param {HttpArgumentsHost} httpContext
   * @return {*}
   * @memberof BaseExceptionFilter
   */
  protected getResponse(httpContext: HttpArgumentsHost): Response {
    return httpContext.getResponse<Response>();
  }

  /**
   *  http 
   *
   * @protected
   * @param {HttpArgumentsHost} httpContext
   * @return {*}
   * @memberof BaseExceptionFilter
   */
  protected getRequest(httpContext: HttpArgumentsHost): Request {
    return httpContext.getRequest<Request>();
  }

  /**
   *  
   *
   * @param {ArgumentsHost} host
   * @param {BaseException} exception
   * @memberof BaseExceptionFilter
   */
  protected writeToClient(host: ArgumentsHost, exception: BaseException) {
    const ctx = this.getHttpContext(host);
    if(exception instanceof BaseException){
      this.getResponse(ctx).status(exception.statusCode).json({
        exceptionCode: exception.getExceptionCode(),
        message: exception.getErrorMessage(),
        path: this.getRequest(ctx).url
      });
    }else {
      const httpException=exception ;
      this.getResponse(ctx).status(500).json({
        message: " ",
        path: this.getRequest(ctx).url
      });
    }

  }
}

새 무단 예외 처리:

import { ArgumentsHost, Catch } from "@nestjs/common";
import { AuthException } from "src/exceptions/auth.exception";
import { BaseException } from "src/exceptions/base.exception";
import { BaseExceptionFilter } from "./base.exception.filter";

@Catch(AuthException)
export class AuthExceptionFilter extends BaseExceptionFilter
{
  constructor(){
    super();
    console.log(" "+new Date().toISOString());
  }
  catch(exception: AuthException, host: ArgumentsHost) {
    exception.exceptionCode=40002;
    console.log(" "+new Date().toISOString());
    this.writeToClient(host,exception);
  }

}

무단 예외 처리 클래스에 대한 몇 가지 설명:
  • 캐치 주석이 추가되었습니다. Authexception의 이상만 포착하고 다른 종류의 이상은 처리하지 않습니다.
  • 사용자 정의 이상 처리 클래스 계승 Baseexceptionfilter
  • 적용 범위


    이상 처리 클래스는 method, controller, 전역, 심지어 같은 Controller에서 여러 개의 사용자 정의 이상 클래스를 정의할 수 있다
    
    import { Controller, ForbiddenException, Get, HttpException, HttpStatus, UseFilters } from '@nestjs/common';
    import { AppService } from './app.service';
    import { AuthException } from './exceptions/auth.exception';
    import { BusinessException } from './exceptions/business.exception';
    import { UnCauhtException } from './exceptions/uncauht.exception';
    import { AuthExceptionFilter } from './filters/auth.exception.filter';
    import { BusinessExceptionFilter } from './filters/business.exception.filter';
    
    
    /**
     *  ff
     */
    @UseFilters(AuthExceptionFilter,BusinessExceptionFilter)
    @Controller()
    export class AppController {
     constructor(private readonly appService: AppService) {}
    
     @Get()
     getHello(): string {
      //throw new Error("666");
      throw new BusinessException(" ",HttpStatus.OK);
      throw new AuthException();
      throw new HttpException(" ",HttpStatus.FORBIDDEN);
      return this.appService.getHello();
     }
    
     @Get("name")
     getName():string
     {
      return "guozhiqi";
     }
    }
    
    
    몇 가지 설명:
  • Usefilters 주석을 사용하여 이상 필터를 추가합니다
  • 우리는 Appcontroller에서 두 가지 서로 다른 유형의 사용자 정의 이상 처리 클래스를 정의했다
  • 즉 우리 Appcontroller에서 던진 이상이다. 우리가 정의한 이 두 가지라면 모두 정상적으로 처리될 수 있다..
  • 몇 가지 의문
    Usefitlers에서 사용자 정의 이상 처리 클래스를 몇 번 초기화합니까?
    답: 저희가 유형을 통해 Appcontroller에 등록한 사용자 정의 이상 클래스는 프로그램이 초기화될 때 한 번만 초기화됩니다.즉, 프로그램이 시작된 후,
    controller, 모든method가 정의한 이상 처리 클래스는 이미 확정되었습니다.
    만약 우리가 이상을 포착했지만 아무런 처리도 하지 않는다면 무슨 일이 일어날까요?
    답: 만약에 우리의 이상 처리 방법이 아무것도 하지 않는다면 축하합니다. 브라우저를 hang사에게 요청하는 데 성공할 것입니다. 이상이 처리되지 않았기 때문에 브라우저는 계속 응답을 받지 못할 것입니다.
    여러 개의 이상 사이의 처리 순서는 어떻습니까?
    답: 만약에 여러 개의 이상 처리가 모두 이 이상을 포착할 수 있다면 첫 번째 효과만 있다. 즉, 이상 처리 클래스와 중간 부품이 다르기 때문에 이상 처리 클래스는 그 중 하나만 처리할 수 있고 중간 부품은 모두 처리해야 한다.
    Nestjs의 @Usefilters는 누구를 닮았습니까?
    우선 JS의 관점에서 보면 Angular 같고, 뒷면을 보면 Spring 같다. 
    Nestjs의 이상 처리는 복잡하지 않습니다. 복잡한 것은 우리가 서로 다른 유형의 이상을 처리하고 이상의 공통성을 추출해야 한다는 것입니다.
    참고 문서:docs.nestjs.cn
    nestjs의 이상 필터 Exception filter에 대한 구체적인 사용에 관한 이 글은 여기에 소개되었습니다. 더 많은 nest 이상 필터 Exception filter 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기