JS 백엔드 프레임 워크 Nest.js 소개 기사 예외 처리, 예외 필터 aop, ExceptionFilter (8 개)

참고 :이 글은 nestjs를 처음 배운 후 블로거의 지식과 이해를 기록한 것입니다. 아직 경험이 얕고 글의 내용은 참고 용일뿐입니다. 오류가 있으면 수정 해주세요.

하나 : 측면으로

이 기사에서는 세부 사항을 일시적으로 논의하지 않습니다.

1. Aspect 유형 : ExceptionFilter 인터페이스 구현 클래스

2. Aspect 입력

HttpException 예외 개체
ArgumentsHost 매개 변수 호스트 개체

3. 단면 출력 : 이상 반응 구성

4. 사용 시나리오의 측면

  • 예외 처리

예외 처리

기본 제공 예외 계층은 전체 응용 프로그램에서 발생한 모든 예외를 처리합니다. 처리되지 않은 예외가 발견되면 최종 사용자는 친숙한 응답을 받게됩니다.

1. 처리 없음

  • 전역 캡처 후 반환 된 응답 구조
{
    
    
    "statusCode": 500,
    "message": "Internal server error"
}

2. 일반 수요 처리

  • 수동으로 던지기
// 方式1:直接抛出HttpException,异常信息为forbidden
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
// 方式2:直接抛出HttpException,异常信息为object
throw new HttpException({
    
    
    status: HttpStatus.FORBIDDEN,
    error: 'This is a custom message',
  }, HttpStatus.FORBIDDEN);
// 方式3:抛出HttpException子类(内置异常/自定义异常)
throw new UnAuthenticationException();
// 自定义异常类UnAuthenticationException
// export class UnAuthenticationException extends HttpException {
    
    
//   constructor() {
    
    
//     super('not authentication', 30000);
//   }
// }
  • 전역 캡처 후 반환 된 응답 구조
// 方式1
{
    
    
    "statusCode": 403,
    "message": "Forbidden"
}
// 方式2
{
    
    
  "status": 403,
  "error": "This is a custom message"
}
// 方式3
{
    
    
    "statusCode": 30000,
    "message": "not authentication"
}

3. 복잡한 수요 처리

특정 응답이 예외에 의해 캡처되기 전에 aop aspect 처리 (예 : 로깅 등)를 추가해야하는 경우 예외 필터를 추가하여 달성 할 수 있습니다.

수동 투척 (이 측면에주의하지 마십시오)
예외 필터 캡처
  • 예외 필터 정의
import {
    
     ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import {
    
     Request, Response } from 'express';

@Catch(HttpException)// @Catch()会捕获不经手动抛出的异常(即第一种不作处理的异常)
export class HttpExceptionFilter implements ExceptionFilter {
    
    
  catch(exception: HttpException, host: ArgumentsHost) {
    
    
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = exception.getStatus();
	// 在此可做一些切面操作,如记录日志,也可修改响应结构
    response
      .status(status)
      .json({
    
    
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url,
      });
  }
}
// 另一种:继承式全局异常过滤器
  • 예외 필터 바인딩
@Post()
@UseFilters(HttpExceptionFilter) // 通过@UseFilters这个装饰器,使被装饰的方法绑定HttpExceptionFilter这个异常过滤器
async create(@Body() createCatDto: CreateCatDto) {
    
    
  throw new ForbiddenException();
}
// 另一种:也可绑定为全局/模块异常过滤器
전역 캡처 후 반환 된 응답 구조
{
    
    
  statusCode: 'status:xxx',
  timestamp: 'date:xxx',
  path: 'url:xxx',
}

추천

출처blog.csdn.net/jw2268136570/article/details/107842626