适配器
WebSockets 模块是平台无关的,因此,您可以通过使用 WebSocketAdapter 接口来引入自己的库(甚至是原生实现)。该接口强制实现下表中描述的几种方法:
扩展 socket.io
socket.io 包被封装在 IoAdapter 类中。如果您想增强适配器的基本功能怎么办?例如,您的技术要求需要能够在多个负载均衡的 Web 服务实例之间广播事件。为此,您可以扩展 IoAdapter 并重写一个负责实例化新 socket.io 服务器的方法。但首先,让我们安装所需的包。
warning 警告 要将 socket.io 与多个负载均衡实例一起使用,您必须在客户端的 socket.io 配置中设置
transports: ['websocket']来禁用轮询,或者必须在负载均衡器中启用基于 Cookie 的路由。仅使用 Redis 是不够的。有关更多信息,请参阅 here。
安装包后,我们可以创建一个 RedisIoAdapter 类。
然后,只需切换到您新创建的 Redis 适配器。
Ws 库
另一个可用的适配器是 WsAdapter,它充当框架与集成快速且经过充分测试的 ws 库之间的代理。该适配器与原生浏览器 WebSockets 完全兼容,并且比 socket.io 包快得多。不幸的是,它开箱即用的功能要少得多。但在某些情况下,您不一定需要它们。
info 提示
ws库不支持命名空间(由socket.io推广的通信通道)。但是,为了以某种方式模拟此功能,您可以在不同路径上挂载多个ws服务器(示例:@WebSocketGateway({ path: '/users' }))。
为了使用 ws,我们首先必须安装所需的包:
安装包后,我们可以切换适配器:
info 提示
WsAdapter从@nestjs/platform-ws导入。
wsAdapter 旨在处理 { event: string, data: any } 格式的消息。如果您需要接收和处理不同格式的消息,则需要配置消息解析器以将其转换为所需的格式。
或者,您可以在创建适配器后使用 setMessageParser 方法配置消息解析器。
高级(自定义适配器)
出于演示目的,我们将手动集成 ws 库。如前所述,该库的适配器已经创建,并从 @nestjs/platform-ws 包中作为 WsAdapter 类公开。以下是简化实现的可能样子:
info 提示 当您想利用 ws 库时,请使用内置的
WsAdapter,而不是创建自己的。
然后,我们可以使用 useWebSocketAdapter() 方法设置自定义适配器:
示例
使用 WsAdapter 的工作示例可在 here 获得。

