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

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

相关推荐
java干货6 分钟前
深度解析:Spring Boot 配置加载顺序、优先级与 bootstrap 上下文
前端·spring boot·bootstrap
Uyker27 分钟前
微信小程序动态效果实战指南:从悬浮云朵到丝滑列表加载
前端·微信小程序·小程序
小小小小宇1 小时前
前端按需引入总结
前端
小小小小宇1 小时前
React 的 DOM diff笔记
前端
小小小小宇1 小时前
react和vue DOM diff 简单对比
前端
我在北京coding1 小时前
6套bootstrap后台管理界面源码
前端·bootstrap·html
Carlos_sam1 小时前
Opnelayers:封装Popup
前端·javascript
前端小白从0开始2 小时前
Vue3项目实现WPS文件预览和内容回填功能
前端·javascript·vue.js·html5·wps·文档回填·文档在线预览
難釋懷3 小时前
Vue解决开发环境 Ajax 跨域问题
前端·vue.js·ajax