异常过滤器
异常过滤器
HTTP异常过滤器层和相应的微服务层之间的唯一区别是HttpException
,您应该使用而不是抛出RpcException
。
throw new RpcException('Invalid credentials.'
提示
的RpcException
类是从进口@nestjs/microservices
包。
Nest将处理抛出的异常,因此返回error
具有以下结构的对象:
{
status: 'error',
message: 'Invalid credentials.'
}
过滤器
该例外过滤器
以同样的方式作为主要做些工作,有一个小的差异。该catch()
方法必须返回一个Observable
。
RPC-exception.filter.ts
JS
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()
}
}
警告
无法全局设置微服务异常过滤器。
下面是一个使用手动实例化的方法范围
过滤器(类范围的工作)的示例:
@UseFilters(new ExceptionFilter())
@MessagePattern{ cmd: 'sum' })
sum(data: number[]): number {
return (data || []).reduce((a, b) => a + b
}
遗产
通常,您将创建完全自定义的异常过滤器,以满足您的应用程序要求。虽然您希望重用已经实现的核心异常过滤器
并根据某些因素覆盖行为,但可能存在用例。
为了将异常处理委托给基本过滤器,您需要扩展BaseExceptionFilter
并调用继承的catch()
方法。此外,HttpServer
必须注入引用并传递给super()
调用。
JS
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
}
}
显然,您应该使用您量身定制的业务
逻辑(例如添加各种条件)来增强上述实现。