在线文档教程

异常过滤器

异常过滤器

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

显然,您应该使用您量身定制的业务逻辑(例如添加各种条件)来增强上述实现。