HTTP 异常过滤器层与相应的微服务层之间的唯一区别是,您不应抛出 HttpException
,而应使用 RpcException
。
ts
throw new RpcException('Invalid credentials.')
RpcException
类从 @nestjs/microservices
包导入。
使用上面的示例,Nest 将处理抛出的异常并返回具有以下结构的 error
对象:
json
{
"status": "error",
"message": "Invalid credentials."
}
过滤器
微服务异常过滤器的行为与 HTTP 异常过滤器类似,但有一个小区别。catch()
方法必须返回一个 Observable
。
ts
rpc-exception.filter
ts
import { ArgumentsHost, Catch, RpcExceptionFilter } 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()
装饰器)。
ts
TS
ts
@UseFilters(new ExceptionFilter())
@MessagePattern({ cmd: 'sum' })
accumulate(data: number[]): number {
return (data || []).reduce((a, b) => a + b);
}
继承
通常,您将创建完全自定义的异常过滤器,以满足您的应用程序要求。但是,在某些情况下,您可能只想扩展核心异常过滤器,并根据某些因素覆盖行为。
为了将异常处理委托给基本过滤器,您需要扩展BaseExceptionFilter
并调用继承的catch()
方法。
ts
TS
ts
import { ArgumentsHost, Catch } from '@nestjs/common'
import { BaseRpcExceptionFilter } from '@nestjs/microservices'
@Catch()
export class AllExceptionsFilter extends BaseRpcExceptionFilter {
catch(exception: any, host: ArgumentsHost) {
return super.catch(exception, host)
}
}
上述实现只是演示该方法的一个外壳。您对扩展异常过滤器的实现将包括您定制的业务逻辑(例如,处理各种条件)。