网关
在 Nest
中,网关只是一个用 @WebSocketGateway()
装饰器注解的类。从技术上讲,网关与平台无关,这使得它们在创建适配器之后就可以与任何 WebSockets
库兼容。有两个开箱即用的WS平台:socket.io和ws。
WebSocketGateway常用配置
在 NestJS 中,WebSocketGateway
是一个装饰器,用于创建 WebSocket 服务器。它可以接受一个可选的配置对象,该对象允许你自定义 WebSocket 服务器的各种属性。以下是一些常见的配置选项及其解释:
port
:指定 WebSocket 服务器监听的端口。如果未指定,WebSocket 服务器将共享由 HTTP 服务器使用的端口。namespace
或path
:定义一个命名空间或路径,这允许你在同一个端口上运行多个 WebSocket 服务器。server
:允许你传递一个现有的 HTTP 或 HTTPS 服务器实例,WebSocket 服务器将附加到此实例。transport
:指定底层传输协议。Nest 支持两种传输协议:Transport.TCP
和Transport.REDIS
。options
:这是一个对象,允许传递更多的自定义配置,这些配置依赖于底层使用的 WebSocket 库(如ws
或socket.io
)。例如,你可以设置cors
来允许跨域请求。cors
:配置跨源资源共享(CORS)选项,例如允许的源、方法等。allowEIO3
:这是一个特定于socket.io
的选项,当设置为true
时,允许与较旧版本的 Engine.IO 协议兼容。
这些配置选项提供了高度的灵活性,使你能够根据应用程序的需要定制 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)的最大缓存时间。
例如:
ts
@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 连接非常重要。
- 性能相关选项:如连接超时时间、心跳检测间隔等。
- 兼容性选项 :例如
allowEIO3
在socket.io
中用于兼容老版本的 Engine.IO。
例如,使用 socket.io
的配置可能是这样的:
php
javascriptCopy code
@WebSocketGateway(80, {
options: {
path: '/websockets/',
serveClient: false,
pingInterval: 10000,
pingTimeout: 5000,
cookie: false
}
})
这里的 options
对象配置了 WebSocket 连接的路径、服务客户端脚本、心跳检测间隔和超时时间以及是否发送 cookie。
cors
和 options
提供了控制 WebSocket 服务器安全性和行为的重要手段。正确配置这些参数有助于确保你的 WebSocket 服务既安全又高效。在配置时,最好参考你所使用的 WebSocket 库的文档,以了解所有可用的配置选项和它们的具体含义。