ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 异常过滤器 `HTTP`异常过滤器层和相应的微服务层之间的唯一区别在于,不要使用 `HttpException`,而应该使用 `RpcException`。 ```typescript throw new RpcException('Invalid credentials.'); ``` > `RpcException` 需要从 `@nestjs/microservices` 包导入。 Nest将处理抛出的异常,并因此返回具有以下结构的 `error` 对象: ```json { "status": "error", "message": "Invalid credentials." } ``` ### 过滤器 **异常过滤器** 的工作方式与主过滤器相同,只有一个小的区别。`catch()` 方法必须返回一个 `Observable`。 > rpc-exception.filter.ts ```typescript import { Catch, RpcExceptionFilter, ArgumentsHost } from '@nestjs/common'; import { Observable, throwError } from 'rxjs'; import { RpcException } from '@nestjs/microservices'; @Catch(RpcException) export class ExceptionFilter implements RpcExceptionFilter<RpcException> { catch(exception: RpcException, host: ArgumentsHost): Observable<any> { return throwError(exception.getError()); } } ``` > 在使用混合应用程序功能时,全局的微服务异常过滤器不是默认开启的。 下面是一个使用手动实例化 **方法作用域** 过滤器,与HTTP应用一样,你也可以使用控制器作用域的过滤器(例如在控制器类前使用`@UseFilters()`装饰器前缀): ```typescript @UseFilters(new ExceptionFilter()) @MessagePattern({ cmd: 'sum' }) accumulate(data: number[]): number { return (data || []).reduce((a, b) => a + b); } ``` ### 继承 通常,您将创建完全定制的异常过滤器,以满足您的应用程序需求。但是,当您希望重用已经实现的核心异常过滤器并基于某些因素覆盖行为时,可能会有一些用例。 为了将异常处理委托给基本过滤器,您需要扩展 `BaseExceptionFilter` 并调用继承的 `catch()`方法。此外,必须注入 `HttpServer` 引用并将其传递给 `super()` 调用。 ```typescript import { Catch, ArgumentsHost } from '@nestjs/common'; import { BaseRpcExceptionFilter } from '@nestjs/microservices'; @Catch() export class AllExceptionsFilter extends BaseRpcExceptionFilter { catch(exception: any, host: ArgumentsHost) { return super.catch(exception, host); } } ``` 显然,您应该使用您量身定制的业务逻辑(例如添加各种条件)来增强上述实现。