JS back-end framework Nest.js artículo introductorio manejo de excepciones, filtro de excepción aop, ExceptionFilter (ocho)

Nota: este artículo solo registra el conocimiento y la comprensión del blogger después de aprender nestjs por primera vez. La experiencia aún es superficial y el contenido del artículo es solo de referencia. Corríjame si hay algún error.

Uno: como aspecto

Este artículo no discutirá los detalles temporalmente.

1. Tipo de aspecto: clase de implementación de la interfaz ExceptionFilter

2. Entrada de aspecto

Objeto de excepción HttpException
Objeto host del parámetro ArgumentsHost

3. Salida de sección transversal: construir una respuesta anormal

4. Usa la escena

  • Manejo de excepciones

Manejo de excepciones

La capa de excepciones incorporada es responsable de manejar todas las excepciones lanzadas en toda la aplicación. Cuando se detecta una excepción no controlada, el usuario final recibirá una respuesta amigable.

1. Sin procesamiento

  • Estructura de respuesta devuelta después de la captura global
{
    
    
    "statusCode": 500,
    "message": "Internal server error"
}

2. Procesamiento de demanda general

  • Lanzar manualmente
// 方式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);
//   }
// }
  • Estructura de respuesta devuelta después de la captura global
// 方式1
{
    
    
    "statusCode": 403,
    "message": "Forbidden"
}
// 方式2
{
    
    
  "status": 403,
  "error": "This is a custom message"
}
// 方式3
{
    
    
    "statusCode": 30000,
    "message": "not authentication"
}

3. Procesamiento de demanda compleja

Antes de que la respuesta específica sea capturada por la excepción, si existe la necesidad de agregar un procesamiento de aspecto op (como registro, etc.), se puede lograr agregando un filtro de excepción.

Lanzamiento manual (no prestes atención a este aspecto)
Captura de filtro de excepción
  • Definición de filtro de excepción
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,
      });
  }
}
// 另一种:继承式全局异常过滤器
  • Enlace de filtro de excepción
@Post()
@UseFilters(HttpExceptionFilter) // 通过@UseFilters这个装饰器,使被装饰的方法绑定HttpExceptionFilter这个异常过滤器
async create(@Body() createCatDto: CreateCatDto) {
    
    
  throw new ForbiddenException();
}
// 另一种:也可绑定为全局/模块异常过滤器
Estructura de respuesta devuelta después de la captura global
{
    
    
  statusCode: 'status:xxx',
  timestamp: 'date:xxx',
  path: 'url:xxx',
}

Supongo que te gusta

Origin blog.csdn.net/jw2268136570/article/details/107842626
Recomendado
Clasificación