异常筛选器 Exception filters

导读

HTTP 异常过滤器 层与相应的 Web 套接字层之间的唯一区别是,您不应抛出 HttpException,而应使用 WsException

ts
throw new WsException('Invalid credentials.')
提示

WsException 类从 @nestjs/websockets 包导入。

对于上述示例,Nest 将处理抛出的异常并发出具有以下结构的 exception 消息:

json
{
  "status": "error",
  "message": "Invalid credentials."
}

过滤器

Web 套接字异常过滤器的行为与 HTTP 异常过滤器相同。以下示例使用手动实例化的方法范围过滤器。与基于 HTTP 的应用程序一样,您也可以使用网关范围过滤器(即,在网关类前添加 @UseFilters() 装饰器)。

ts
@UseFilters(new WsExceptionFilter())
@SubscribeMessage('events')
onEvent(client, data: any): WsResponse<any> {
  const event = 'events';
  return { event, data };
}

继承

通常,您将创建完全自定义的异常过滤器,以满足您的应用程序要求。但是,在某些情况下,您可能只想扩展核心异常过滤器,并根据某些因素覆盖行为。

为了将异常处理委托给基本过滤器,您需要扩展BaseWsExceptionFilter并调用继承的catch()方法。

ts
TS
ts
import { ArgumentsHost, Catch } from '@nestjs/common'
import { BaseWsExceptionFilter } from '@nestjs/websockets'

@Catch()
export class AllExceptionsFilter extends BaseWsExceptionFilter {
  catch(exception: unknown, host: ArgumentsHost) {
    super.catch(exception, host)
  }
}

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