Skip to main content

异常过滤器

HTTP异常过滤器层与相应的WebSockets层之间唯一的区别是, 您应该使用WsException而不是HttpException来抛出异常。

throw new WsException('Invalid credentials.');
tip

WsException类是从@nestjs/websockets软件包导入的。

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

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

过滤器

WebSockets异常过滤器的行为等效于HTTP异常过滤器。 以下示例使用手动实例化的方法范围过滤器。 与基于HTTP的应用程序一样, 您还可以使用网关范围的过滤器(即,在网关类前加上@UseFilters()装饰器)。

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

继承

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

为了将异常处理委托给基本过滤器,您需要扩展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);
}
}

上述实现只是演示了这种方法。您扩展的异常过滤器的实现将包含您的定制业务逻辑(例如,处理各种条件)。