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

下面是关于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日

相关文章

  • ubuntu系统下使用pm2设置nodejs开机自启动的方法

    下面是使用pm2设置Node.js开机自启动的完整攻略。 前置条件 在开始之前,需要确保您已经完成以下任务: 在Ubuntu操作系统中安装Node.js和npm。 在Ubuntu操作系统中安装pm2,可以通过执行以下命令完成安装: npm install pm2 -g。 步骤 启动应用程序 首先,您需要使用pm2启动应用程序。您可以通过在项目根目录下执行以下…

    node js 2023年6月8日
    00
  • Node.js Windows Binary二进制文件安装方法

    Node.js是一种运行在服务器端的JavaScript语言,它能够使得服务器端和客户端都是用JavaScript进行开发,且能够在Windows环境下运行。我们可以通过Windows Binary二进制文件来安装Node.js,本篇攻略将会详细讲解如何进行安装。 步骤一:下载Node.js二进制文件 我们需要去Node.js官网下载适用于Windows的二…

    node js 2023年6月8日
    00
  • Node.js Express 框架 POST方法详解

    一、Node.js Express 框架 POST方法详解 在Node.js开发的web应用中,通常利用Express框架去搭建应用架构,POST方法则是Express框架中常用的一种请求方式。下面详细讲解Node.js Express框架POST方法的使用方式。 二、使用Node.js Express框架的POST方法 通过如下的代码,我们可以实现一个简单…

    node js 2023年6月8日
    00
  • vue执行配置选项npm run serve的本质图文详解

    详细讲解一下“vue执行配置选项npm run serve的本质图文详解”的攻略。 什么是npm run serve? npm是Node.js的包管理工具,其中run是用来运行脚本的命令。而在Vue.js项目中,我们可以在package.json文件中设置脚本命令,比如: "scripts": { "serve": &…

    node js 2023年6月8日
    00
  • Node.js中使用事件发射器模式实现事件绑定详解

    以下是一份详细的“Node.js中使用事件发射器模式实现事件绑定详解”的攻略: 一、什么是事件发射器? 事件发射器(Event Emitter)是Node.js中内置的一个模块,它可以让我们实现事件与事件处理函数的关联。事件发射器模式又称为观察者模式(Observer Pattern),它通过一种对象间的发布/订阅机制来解耦应用程序的组件。事件发射器将会发射…

    node js 2023年6月8日
    00
  • Node.js中的http请求客户端示例(request client)

    当我们需要在Node.js中向其他服务器发送HTTP请求时,可以使用内置的HTTP模块提供的客户端功能,也可以使用第三方模块request。 下面是使用request模块发送HTTP请求的示例代码: 首先需要在项目中引入request模块: const request = require(‘request’); 然后,我们可以使用request模块的requ…

    node js 2023年6月8日
    00
  • Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法

    Node.js中的fs模块(文件模块)提供了许多与文件系统交互的方法。包括创建、删除目录(文件),读取、写入文件等操作。下面将介绍如何使用fs模块进行这些操作。 创建目录 在Node.js中使用fs模块中的fs.mkdir()方法来创建一个目录。该方法接收路径和控制选项作为参数。例如: const fs = require(‘fs’); fs.mkdir(‘…

    node js 2023年6月8日
    00
  • 微信小程序搭载node.js服务器的简单教程

    我们来详细讲解如何搭载一个微信小程序,使其能够与一个node.js服务器进行交互。 前置条件 在开始创建微信小程序之前,请确保准备好以下工具: 微信开发者工具 node.js安装包 npm管理工具 创建微信小程序 首先,我们需要在微信开发者工具中创建一个新的微信小程序项目。在创建项目时,需要设置好项目的appid,并选择一个模板来快速创建项目结构。 创建完毕…

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