NestJS Logo
NestJS 中文文档
v10.0.0
  • 介绍
  • 快速上手
  • 控制器
  • 提供者
  • 模块
  • 中间件
  • 异常过滤器
  • 管道
  • 守卫
  • 拦截器
  • 自定义装饰器
  • 自定义提供者
  • 异步提供者
  • 动态模块
  • 依赖注入作用域
  • 循环依赖
  • 模块引用
  • 懒加载模块
  • 执行上下文
  • 生命周期事件
  • 发现服务
  • 跨平台无关性
  • 测试
迁移指南
API 参考
官方课程
  1. 文档
  2. WebSocket 通信
  3. 异常过滤器

网关
管道

异常过滤器(Exception filters)

HTTP 异常过滤器层与对应的 WebSocket 层唯一的区别在于,这里不再抛出 HttpException,而是应该使用 WsException。

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

WsException 类需从 @nestjs/websockets 包中导入。

如上示例所示,Nest 会自动处理抛出的异常,并发送一个结构如下的 exception 消息:

{
  status: 'error',
  message: 'Invalid credentials.'
}

过滤器(Filters)

WebSocket 异常过滤器的行为与 HTTP 异常过滤器完全一致。下面的示例演示了一个手动实例化的方法作用域过滤器。与基于 HTTP 的应用类似,你也可以使用网关作用域(gateway-scoped)的过滤器(即在网关类前加上 @UseFilters() 装饰器)。

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

继承(Inheritance)

通常,你会根据应用需求自定义异常过滤器。不过,在某些场景下,你可能只需扩展核心异常过滤器(core exception filter),并根据特定条件重写其行为。

要将异常处理委托给基础过滤器,需要继承 BaseWsExceptionFilter 并调用其继承的 catch() 方法。

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

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

上述实现仅为演示用的外壳,展示了扩展方式。你实际扩展的异常过滤器应包含你自定义的业务逻辑(如处理多种条件等)。