异常筛选器 Exception filters

导读

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)
  }
}

上述实现只是演示该方法的一个外壳。您对扩展异常过滤器的实现将包括您定制的业务逻辑(例如,处理各种条件)。