JS后端框架 Nest.js入门篇 异常处理、异常过滤器aop、ExceptionFilter(八)

注:此文仅记录博主初次学习nestjs之后的认识和理解,经验尚浅,文章内容仅供参考,如若有误,敬请指正。

一:作为切面

此文暂不对细节展开探讨

1.切面类型:ExceptionFilter接口实现类

2.切面输入

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切面处理的需求(如日志记录等),可以通过添加异常过滤器的形式实现。

手动抛出(此切面不关注)
异常过滤器捕获
  • 异常过滤器定义
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