在 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
方法中的代码。在这个方法中,您可以添加您的统一处理逻辑,例如记录错误日志或向用户发送错误响应。
请注意,这个解决方案需要在每个服务中重新抛出异常。如果您的服务没有抛出异常,这个过滤器将不会被调用。因此,如果您的服务中有一些无法抛出异常的代码,您可能需要考虑其他解决方案。例如,您可以考虑使用中间件来捕获和处理这些服务中发生的错误。