Nest中的SocketIO网关配置(WebSocketGateway)

843 阅读5分钟

网关

在 Nest 中,网关只是一个用 @WebSocketGateway() 装饰器注解的类。从技术上讲,网关与平台无关,这使得它们在创建适配器之后就可以与任何 WebSockets 库兼容。有两个开箱即用的WS平台:socket.iows

image.png

WebSocketGateway常用配置

在 NestJS 中,WebSocketGateway 是一个装饰器,用于创建 WebSocket 服务器。它可以接受一个可选的配置对象,该对象允许你自定义 WebSocket 服务器的各种属性。以下是一些常见的配置选项及其解释:

  1. port:指定 WebSocket 服务器监听的端口。如果未指定,WebSocket 服务器将共享由 HTTP 服务器使用的端口。

  2. namespacepath:定义一个命名空间或路径,这允许你在同一个端口上运行多个 WebSocket 服务器。

  3. server:允许你传递一个现有的 HTTP 或 HTTPS 服务器实例,WebSocket 服务器将附加到此实例。

  4. transport:指定底层传输协议。

    WebSockets (WS) :

    • 这是最常见的传输方式,提供全双工通信能力。
    • 它在一个单独的 TCP 连接上启动,并在初始握手后维持持久连接。
    • 适用于实时和高效的数据传输。

    Long Polling:

    • 当 WebSockets 不可用时,通常作为后备选项。
    • 客户端发起 HTTP 请求到服务器,服务器保持连接打开,直到有数据发送,然后关闭连接。客户端随即启动新的请求。
    • 这种方式更消耗资源且延迟较高,但可以在旧的浏览器或网络环境中使用。

    Polling (HTTP Polling) :

    • 最基本的传输方式,客户端定期向服务器发送 HTTP 请求以获取更新。
    • 每次请求都是独立的,不保持持久连接。
    • 相比于 Long Polling,它的实时性更差,但兼容性更好。
  5. options:这是一个对象,允许传递更多的自定义配置,这些配置依赖于底层使用的 WebSocket 库(如 wssocket.io)。例如,你可以设置 cors 来允许跨域请求。

  6. cors:配置跨源资源共享(CORS)选项,例如允许的源、方法等。

  7. allowEIO3:这是一个特定于 socket.io 的选项,当设置为 true 时,允许与较旧版本的 Engine.IO 协议兼容。

  8. connectTimeOut:断开未成功加入命名空间的客户端的连接所需的毫秒数,默认45000

这些配置选项提供了高度的灵活性,使你能够根据应用程序的需要定制 WebSocket 服务器。在使用这些选项时,你应该根据你的具体需求和底层 WebSocket 库的文档进行选择和配置。

CORS(Cross-Origin Resource Sharing)

CORS 是一种安全机制,用于控制不同源之间的资源共享。在 WebSocket 和 HTTP 服务器上配置 CORS 可以决定哪些外部源被允许与你的服务器通信。在 WebSocketGateway 中配置 CORS 通常涉及以下几个方面:

  • Origin: 指定哪些源(网站)可以访问你的 WebSocket 服务器。可以是一个具体的 URL,也可以是一个返回布尔值的函数,或者是一个包含多个 URL 的数组。
  • Methods: 指定允许的 HTTP 请求方法,如 GET, POST 等。
  • Allowed Headers: 指定允许的 HTTP 请求头。
  • Credentials: 布尔值,指示是否允许发送凭证(如 cookies)。
  • Exposed Headers: 指定允许暴露给外部的响应头。
  • Max Age: 设置预检请求(pre-flight request)的最大缓存时间。

例如:

@WebSocketGateway({
  cors: {
    origin: 'https://example.com',
    methods: ['GET', 'POST'],
    allowedHeaders: ['my-custom-header'],
    credentials: true
  }
})

Options

options 是一个更广泛的配置对象,用于提供特定于底层 WebSocket 库的配置。这些选项取决于你使用的库(如 ws, socket.io 等)。一些常见的 options 包括:

  • 传输层相关选项:例如,可以设置传输模式、序列化和反序列化机制等。
  • 安全相关选项:例如 SSL/TLS 配置,这对于 HTTPS WebSocket 连接非常重要。
  • 性能相关选项:如连接超时时间、心跳检测间隔等。
  • 兼容性选项:例如 allowEIO3socket.io 中用于兼容老版本的 Engine.IO。

例如,使用 socket.io 的配置可能是这样的:

javascriptCopy code
@WebSocketGateway(80, {
  options: {
    path: '/websockets/',
    serveClient: false,
    pingInterval: 10000,
    pingTimeout: 5000,
    cookie: false
  }
})

这里的 options 对象配置了 WebSocket 连接的路径、服务客户端脚本、心跳检测间隔和超时时间以及是否发送 cookie。

corsoptions 提供了控制 WebSocket 服务器安全性和行为的重要手段。正确配置这些参数有助于确保你的 WebSocket 服务既安全又高效。在配置时,最好参考你所使用的 WebSocket 库的文档,以了解所有可用的配置选项和它们的具体含义。

客户端IO配置

  1. autoConnect:布尔值,指定是否在实例化时自动连接到服务器。默认为 true。如果设置为 false,则需要手动调用 socket.connect()
  2. reconnection:布尔值,指示在初始连接失败后客户端是否应该尝试重新连接。默认为 true
  3. reconnectionAttempts:数字,表示在放弃之前尝试重新连接的次数。默认为 Infinity(无限次)。
  4. reconnectionDelay:数字,表示每次重连尝试之间的延迟时间(毫秒)。默认值是 1000(1 秒)。
  5. reconnectionDelayMax:数字,表示重连尝试之间的最大延迟时间(毫秒)。默认值是 5000(5 秒)。
  6. timeout:数字,表示连接超时时间(毫秒)。如果在这个时间内未建立连接,则认为连接失败。默认是 20000(20 秒)。
  7. transports:字符串数组,指定客户端尝试连接时使用的传输方式。例如 ['websocket', 'polling']。这可以影响连接的兼容性和性能。
  8. upgrade:布尔值,指示是否应该在可能的情况下从轮询传输升级到 WebSocket。默认为 true
  9. query:对象或字符串,用于在连接请求中发送额外的查询参数。
  10. forceNew:布尔值,指示是否应该为每次 io() 调用创建一个新的 Socket 实例。默认为 false
const socket = io(url, { 
    reconnection: true, 
    reconnectionDelay: 1000, 
    reconnectionDelayMax: 5000, 
    reconnectionAttempts: 5, 
    transports: ['websocket'], 
    timeout: 20000 
 });

参考链接

- Nest官网 - SocketIO-