nestjs中异常过滤器Exceptionfilter的具体使用

yizhihongxing

下面是关于nestjs中异常过滤器ExceptionFilter的具体使用的攻略。

一、异常过滤器(ExceptionFilter)

在 Nest.js 中,我们可以使用 ExceptionFilter 对应用程序进行全局和局部错误处理。ExceptionFilter 可以帮助我们捕获抛出的异常并将其转换为可读错误响应或其他适当的操作。

1. 全局异常过滤器

全局异常过滤器默认存在于 Nest 应用程序中,可以处理不受控的异常。如果想要自定义全局异常处理可以新建一个全局的过滤器,然后在应用程序的主文件中进行引入。

新建一个全局的异常过滤器如下:

import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { Response, Request } from 'express';

@Catch()
export class AnyExceptionFilter implements ExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = (exception?.status && typeof exception.status === 'number') ? exception.status : 500;

    response.status(status).json({
      statusCode: status,
      timestamp: new Date().toISOString(),
      path: request.url,
      message: exception.message || 'Internal Server Error',
    });
  }
}

上面的代码 使用 @Catch() 装饰器标记了这是一个捕捉所有错误的过滤器,并实现了 ExceptionFilter 接口,覆盖了 catch() 方法。在捕获任何异常时,该方法都会自动触发,并根据异常返回适当的 HTTP 响应。

同时,在我们的应用程序的主入口文件(比如 main.ts)中引入该过滤器:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { AnyExceptionFilter } from './filters/any-exception.filter';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new AnyExceptionFilter());
  await app.listen(3000);
}
bootstrap();

以上代码通过使用 useGlobalFilters() 方法将新的 ExceptionFilter 实例添加到应用程序的全局过滤器列表中。这意味着每当我们在应用程序中抛出异常时,都会使用自定义的 AnyExceptionFilter 进行处理。

2. 局部异常过滤器

我们还可以使用局部过滤器来对指定路由的异常进行处理,使用 @UseFilters() 装饰器来指定为路由添加过滤器。

import { Controller, Get, UseFilters } from '@nestjs/common';
import { CustomException } from '../exceptions/custom.exception';
import { CustomExceptionFilter } from '../filters/custom-exception.filter';

@Controller('customers')
@UseFilters(CustomExceptionFilter)
export class CustomersController{
  @Get()
  getAll() {
    throw new CustomException('Something bad happened');
  }
}

上面的代码,我们创建了一个 CustomExceptionFilter 过滤器,在 CustomersController 控制器的装饰器 @UseFilters() 中通过传递过滤器实例来为该控制器添加了局部过滤器。当我们在应用程序中发生 CustomException 异常时,上述自定义局部过滤器将使用其 catch() 方法捕获该异常并将异常转换为适当的 http 响应。

二、示例说明

下面通过两个示例来进行进一步说明如何使用 ExceptionFilter。

示例一:自定义ExceptionFilter

假设我们的API中会抛出自定义的异常,我们可以通过自定义的过滤器来统一拦截这些异常,并格式化返回到客户端。

import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { Response, Request } from 'express';

@Catch(Error)
export class CustomExceptionFilter implements ExceptionFilter {
  catch(error: Error, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();

    let statusCode = 500;
    if (error instanceof HttpException) {
      // HttpException是Nest的一个内置的异常类
      statusCode = error.getStatus();
    }

    response.status(statusCode).json({
      statusCode,
      path: request.url,
      timestamp: new Date().toISOString(),
      message: error.message || 'Internal Server Error',
    });
  }
}

上面的代码实现了我们的自定义过滤器CustomExceptionFilter,假设我们在代码中抛出了一个自定义的异常CustomException,通过实现 catch() 方法来根据异常生成响应信息。通过 switchToHttp() 方法将请求和响应对象转换为了 ResponseRequest 对象。

示例二:过滤特定异常

除了处理自定义异常,我们还可以根据实际情况在同一个过滤器中处理不同的异常。

import { ExceptionFilter, Catch, ArgumentsHost, NotFoundException } from '@nestjs/common';
import { Response, Request } from 'express';

@Catch()
export class CustomExceptionFilter implements ExceptionFilter {
  catch(error: Error, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();

    console.error(error);

    let statusCode = 500;
    if (error instanceof NotFoundException) {
      statusCode = 404;
    }
    else if (error instanceof HttpException) {
      statusCode = error.getStatus();
    }

     response.status(statusCode).json({
      statusCode,
      path: request.url,
      timestamp: new Date().toISOString(),
      message: error.message || 'Internal Server Error',
    });
  }
}

上面的代码引入了 NotFoundException 并且使用 instanceOf 检查可以拦截是否是该异常类型。我们同样可以响应地处理其它的异常类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nestjs中异常过滤器Exceptionfilter的具体使用 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodeJS express路由学习req.body与req.query方法实例详解

    一、准备工作 在学习Node.js Express路由时,我们需要事先安装好Node.js和Express,并学会如何启动和运行一个Node.js Express服务器。 二、路由基本概念 路由是指在Web应用程序中识别特定状态和参数传递的url并且提供相应的响应或页面的过程。在Node.js Express中,路由是由路由模块进行定义和配置。 三、req.…

    node js 2023年6月8日
    00
  • nodejs 图片预览和上传的示例代码

    下面是关于“nodejs 图片预览和上传”的完整攻略。 步骤一:安装依赖 在开始编写nodejs图片上传和预览的代码前,需要安装必要的依赖项。首先进入项目文件夹,打开命令行工具,执行以下命令: npm init -y 这个命令会自动生成一个package.json文件,保存项目的信息和依赖项。接下来,安装express和multer依赖包: npm inst…

    node js 2023年6月8日
    00
  • vue中eslintrc.js配置最详细介绍

    下面我来详细讲解一下“Vue中eslintrc.js配置最详细介绍”的攻略。 1. 什么是ESLint 首先,ESLint是一个代码检查工具,可以用来规范Javascript代码。其可以通过检测潜在的问题以及风格问题来确保代码的一致性和可读性。 2. ESLint在Vue项目中的作用 在Vue项目中使用ESLint可以对Vue组件以及JavaScript代码…

    node js 2023年6月8日
    00
  • node.js中的querystring.stringify方法使用说明

    下面是关于node.js中的querystring.stringify方法的详细讲解。 一、什么是querystring.stringify方法? 在node.js中,querystring是一个用于解析和格式化URL查询字符串的模块。其中,querystring.stringify方法可以将JavaScript对象序列化为URL查询字符串。这个方法的使用方…

    node js 2023年6月8日
    00
  • 初探nodeJS

    初探Node.js Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。 它以事件驱动、非阻塞 I/O 模型闻名于世,使得JavaScript可以在服务器端也实现高性能的编程和网络应用的开发。 在本篇文章中,我们将开始介绍 Node.js 的入门知识。下面是初探 Node.js 的攻略。 安装 Node.js 能够开始学习 …

    node js 2023年6月7日
    00
  • node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作

    Node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作 在 Node.js 的应用中,操作 MySQL 数据库是一项非常重要的任务。本文将介绍如何使用 Node.js 连接 MySQL 服务器,并进行数据库操作。 1. 安装 mysql 模块 在开始之前,需要安装 mysql 模块。使用 npm 命令即可: npm install …

    node js 2023年6月8日
    00
  • node.js中的events.emitter.listeners方法使用说明

    当我们在使用Node.js进行编程时,经常需要使用事件驱动的编程模式。Node.js中有一个内置模块events,可以方便地实现事件的发布和订阅。其中,events模块提供了一个listeners()方法,用于获取指定事件的所有监听函数,下面是该方法的详细使用说明。 EventEmitter.listeners(eventName) 该方法用于获取指定事件的…

    node js 2023年6月8日
    00
  • nodeJS中关于path.resolve()的用法解析

    当我们在Node.js中编写代码时,需要处理文件路径的时候,就需要用到path.resolve()方法。这个方法可以将多个路径解析为一个绝对路径。具体的用法如下: 语法 path.resolve([…paths]) 参数 paths:将多个路径连接起来。可以是字符串,也可以是数组。 返回值 一个字符串,为连接起来后的绝对路径。 示例一: const pa…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部