初尝nestjs,捕获异常(第二章)

背景

我们在开发接口的过程中可能会存在很多错误需要处理,如果我们每一个错误都需要单独去处理的话,可能重复性的工作就比较大,降低了效率;这个时候我们就需要同意去做处理,然后我们在抛出错误的时候只需要携带返回错误信息就ok了,这样就大大的增加了我们开发效率以及统一管理。

未处理异常报错

示例:模拟报错

我们通过JSON.parse方式去解析data(data没有传值,或者是一个数值字符串一类的),这个时候正常报错应该是:Unexpected token o in JSON at position 1

但是实际返回的报错是:internet server error 看以下

typescript 复制代码
@Post('v2')
  getHello(@Body() data: any): string {
    JSON.parse(data);
     return this.AuthService.getHello(data);s
  }

报错信息:

typescript 复制代码
{
    "code": 500,
    "msg": "internet server error"
}

我们从以上可以看出:服务器返回的信息是指-->服务器错误,没有返回特定的一些信息,那么我们在排查错误的时候可能就会存在一定的难度,所以有统一的异常返回错误可以,尽快的查到原因以及给前端调用时给与对应的提示。

异常错误统一处理

filter/allException.filter.ts

新建统一处理文件,通过@Catch()进行捕获错误,然后根据相关的api去获取传递的参数,并做出相对应的处理,即可。这儿需要注意两个点:

  • Logger是在控制台打印相关的错误信息
  • response.status(responseStatus)是返回对应的状态以及信息

具体的东西大家可以根据自己的需要进行修改并看相关的文档 统一异常处理相关文档,我目前写的这个也只是简单的示例,仅供参考。

typescript 复制代码
import {
  ExceptionFilter,
  Catch,
  ArgumentsHost,
  HttpException,
  Logger,
  HttpStatus,
} from '@nestjs/common';
import { Request, Response } from 'express';

// 捕获所有异常
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const responseStatus =
      exception instanceof HttpException
        ? 200
        : HttpStatus.INTERNAL_SERVER_ERROR;
    const status =
      exception instanceof HttpException
        ? exception.getStatus()
        : HttpStatus.INTERNAL_SERVER_ERROR;
    const message =
      exception instanceof HttpException
        ? exception.message
        : 'internet server error';

    new Logger('HttpExceptionFilter').error(
      request.url,
      exception.message,
      exception.stack,
    );
    
    response.status(responseStatus).json({
      code: status,
      msg: message,
    });
  }
}

main.ts

在其文件中引入

typescript 复制代码
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { AllExceptionsFilter } from "./filter/allException.filter";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new AllExceptionsFilter()); // 在这儿呢
  await app.listen(3000);
}
bootstrap();

模拟抛出错误

最后我们就是进行测试了,看看异常抛出错误是什么? throw new HttpException(error, HttpStatus.BAD_REQUEST)该串代码是抛出了错误以及状态。

示例:

typescript 复制代码
import { Body, Post, HttpException, HttpStatus } from '@nestjs/common';
@Post('v2')
  getHello(@Body() data: any): string {
    try {
      JSON.parse(data);
      return this.AuthService.getHello(data);
    } catch (error) {
      throw new HttpException(error, HttpStatus.BAD_REQUEST);
    }
  }

抛出错误:

我们现在可以看到返回的错误就是JSON.parse解析失败时返回的错误信息了,说明我们这个抛出异常是没得问题的了。

typescript 复制代码
{
    "code": 400,
    "msg": "Unexpected token o in JSON at position 1"
}

做到这儿了,我们异常统一处理基本上就完成了,如果有兴趣的朋友可以去试试吧!

相关推荐
workbuddy小能手37 分钟前
用 WorkBuddy 部署 Node.js 项目实战:基金导航站与 Markdown 编辑器同机上线
人工智能·ai·node.js·编辑器·workbuddy
名字还没想好☜2 小时前
Next.js App Router 数据获取:fetch 缓存、revalidate 与 dynamic 一次讲清
前端
成都渲染101云渲染66666 小时前
如何在3ds Max中实现更快、更高质量的渲染
前端·javascript·人工智能
闲猫8 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
自信的未来10 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
全栈前端老曹10 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
zhangxingchao11 小时前
AI大模型核心八:从 Agent Skill、长文档 RAG 到知识库更新与训练策略
前端·人工智能·后端
zhangxingchao11 小时前
AI大模型核心七:从 Workflow、RAG、记忆治理到幂等性
前端·人工智能·后端
gyx_这个杀手不太冷静12 小时前
Agent开发进阶指南(第 1 章):AI Agent 到底是什么?
前端·agent·ai编程
小小小小宇12 小时前
模型相关知识
前端