Microservices
异常过滤器
学习如何在 NestJS 微服务中使用异常过滤器来处理错误和异常情况
异常过滤器
HTTP 异常过滤器 层和相应的微服务层之间的唯一区别是,您应该使用 RpcException 而不是抛出 HttpException。
throw new RpcException('Invalid credentials.');
提示 RpcException 类从 @nestjs/microservices 包导入。
使用上面的示例,Nest 将处理抛出的异常并返回具有以下结构的 error 对象:
{
"status": "error",
"message": "Invalid credentials."
}
过滤器
微服务异常过滤器的行为与 HTTP 异常过滤器类似,只有一个小区别。catch() 方法必须返回一个 Observable。
@@filename(rpc-exception.filter)
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());
}
}
@@switch
import { Catch } from '@nestjs/common';
import { throwError } from 'rxjs';
@Catch(RpcException)
export class ExceptionFilter {
catch(exception, host) {
return throwError(() => exception.getError());
}
}
警告 使用混合应用程序时,全局微服务异常过滤器默认不启用。
以下示例使用手动实例化的方法作用域过滤器。就像基于 HTTP 的应用程序一样,您也可以使用控制器作用域过滤器(即,在控制器类前加上 @UseFilters() 装饰器)。
@@filename()
@UseFilters(new ExceptionFilter())
@MessagePattern({ cmd: 'sum' })
accumulate(data: number[]): number {
return (data || []).reduce((a, b) => a + b);
}
@@switch
@UseFilters(new ExceptionFilter())
@MessagePattern({ cmd: 'sum' })
accumulate(data) {
return (data || []).reduce((a, b) => a + b);
}
继承
通常,您会创建完全定制的异常过滤器来满足您的应用程序需求。但是,在某些用例中,您可能希望简单地扩展核心异常过滤器,并根据某些因素重写行为。
为了将异常处理委托给基础过滤器,您需要扩展 BaseExceptionFilter 并调用继承的 catch() 方法。
@@filename()
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);
}
}
@@switch
import { Catch } from '@nestjs/common';
import { BaseRpcExceptionFilter } from '@nestjs/microservices';
@Catch()
export class AllExceptionsFilter extends BaseRpcExceptionFilter {
catch(exception, host) {
return super.catch(exception, host);
}
}
上述实现只是演示方法的外壳。您的扩展异常过滤器实现将包括您定制的业务逻辑(例如,处理各种条件)。