异常过滤器
HTTP 异常过滤器层与相应的 WebSocket 层之间唯一的区别是,你应该使用 WsException 而不是抛出 HttpException。
typescript
throw new WsException('Invalid credentials.');提示
WsException 类从 @nestjs/websockets 包中导入。
通过上面的示例,Nest 将处理抛出的异常并发出具有以下结构的 exception 消息:
typescript
{
status: 'error',
message: 'Invalid credentials.'
}过滤器
WebSocket 异常过滤器的行为与 HTTP 异常过滤器等效。以下示例使用了手动实例化的方法作用域过滤器。与基于 HTTP 的应用程序一样,你也可以使用网关作用域的过滤器(即在网关类前加上 @UseFilters() 装饰器)。
typescript
@UseFilters(new WsExceptionFilter())
@SubscribeMessage('events')
onEvent(client, data: any): WsResponse<any> {
const event = 'events';
return { event, data };
}继承
通常,你会创建完全自定义的异常过滤器来满足应用程序的需求。然而,在某些情况下,你可能只想简单地扩展核心异常过滤器,并根据特定因素覆盖其行为。
要将异常处理委托给基础过滤器,你需要扩展 BaseWsExceptionFilter 并调用继承的 catch() 方法。
typescript
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);
}
}上面的实现只是一个展示方法的外壳。你的扩展异常过滤器实现应该包含你定制的业务逻辑(例如,处理各种条件)。