初尝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"
}

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

相关推荐
37方寸5 小时前
前端基础知识(JavaScript)
开发语言·前端·javascript
json{shen:"jing"}6 小时前
1. 两数之和
前端·javascript·数据库
github.com/starRTC6 小时前
Claude Code中英文系列教程19:使用subagent子代理与创建自定义子代理【重要】
前端·javascript·数据库
hua_ban_yu6 小时前
vue3 + ts 制作指令,防止按钮在固定时间内重复点击,不会影响到表单的校验
前端·javascript·vue.js
老神在在0016 小时前
Token身份验证完整流程
java·前端·后端·学习·java-ee
利刃大大7 小时前
【Vue】指令修饰符 && 样式绑定 && 计算属性computed && 侦听器watch
前端·javascript·vue.js·前端框架
踢球的打工仔8 小时前
typescript-接口的基本使用(一)
android·javascript·typescript
徐小夕@趣谈前端8 小时前
NO-CRM 2.0正式上线,Vue3+Echarts+NestJS实现的全栈CRM系统,用AI重新定义和实现客户管理系统
前端·javascript·人工智能·开源·编辑器·echarts
catino8 小时前
图片、文件上传
前端
Mr Xu_8 小时前
Vue3 + Element Plus 实现点击导航平滑滚动到页面指定位置
前端·javascript·vue.js