nestjs 中如何单独让@Injectable的service中的出错走统一的处理逻辑?

nestjs 中如何单独让@Injectable的service中的出错进行走统一处理的逻辑

当前项目逻辑不走Controller,属于项目启动时就调用service中的逻辑,调用了一个叫 sendTowerJob() 的方法
image.png

然后service那边尝试在 sendTowerJob() 内部throw Exception
image.png

但是尝试过用 FilterInterterceptor 去做一个,能出错时进行统一处理(比如记录一次出错日志的处理)的逻辑,但是发现这他们均是在有客户端发起请求时,即在Controller内部才能生效并触发出错统一处理

因此想问问,在没有请求没有触发Controller,仅仅是内部调用Service中某个逻辑时,如何实现 “所有 Service 在 throw Exception 时会走一个统一处理” 这样一个功能呢?

阅读 372
avatarAI BotBETA

在 NestJS 中,您可以使用异常过滤器(Exception Filters)或拦截器(Interceptors)来处理服务中抛出的异常。然而,由于这些特性是在控制器(Controller)级别上工作的,因此它们在无请求触发的情况下可能无法捕获到异常。

要解决这个问题,您可以使用 NestJS 的应用模块(AppModule)中的 useGlobalFilters 装饰器。这个装饰器允许您在全局范围内应用过滤器。以下是一个示例,演示了如何使用异常过滤器来捕获和处理所有服务中抛出的异常:

import { Module, NestModule, MiddlewareConsumer, UseGlobalFilters, ExceptionFilter, Catch } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';

@Module({
  providers: [
    {
      provide: APP_FILTER,
      useClass: GlobalExceptionFilter,
    },
  ],
  useGlobalFilters: [GlobalExceptionFilter],
})
export class AppModule { }

@Catch()
export class GlobalExceptionFilter implements ExceptionFilter {
  catch(exception: unknown, host: InstanceType<typeof ExceptionFilter>) {
    console.error(exception); // 输出错误信息
    // 在这里添加你的统一处理逻辑
    // ...
  }
}

在这个例子中,GlobalExceptionFilter 是一个全局异常过滤器。它实现了 ExceptionFilter 接口,并覆盖了 catch 方法。当任何服务抛出异常时,这个过滤器会被调用,并执行 catch 方法中的代码。在这个方法中,您可以添加您的统一处理逻辑,例如记录错误日志或向用户发送错误响应。

请注意,这个解决方案需要在每个服务中重新抛出异常。如果您的服务没有抛出异常,这个过滤器将不会被调用。因此,如果您的服务中有一些无法抛出异常的代码,您可能需要考虑其他解决方案。例如,您可以考虑使用中间件来捕获和处理这些服务中发生的错误。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏