网关
网关
Gateway是一个用@WebSocketGateway()
装饰器注释的类。默认情况下,网关使用socket.io包,但也提供与各种其他库的兼容性,包括本机Web套接字实现。
提示
网关与简单提供程序的
行为相同,因此可以通过构造函数轻松地注入依赖关系。此外,网关也可能由其他类(提供者和控制器)注入。
安装
首先,我们需要安装所需的包:
$ npm i --save @nestjs/websockets
概观
通常,每个网关都在侦听与运行HTTP服务器
相同的端口,除非您的应用程序不是Web应用程序,或者您已手动更改了端口。我们可以通过将参数传递给@WebSocketGateway(81)
装饰器来更改此行为,其中81
所选择的端口号。此外,您可以使用以下构造设置此网关使用的命名空间:
@WebSocketGateway(81, { namespace: 'events' })
警告
在将网关放入providers
阵列之前,网关不会启动。
这namespace
不是唯一可用的选项。您可以传递此处提到的任何其他财产。在实例化过程中,这些属性将传递给套接字构造函数。
@WebSocketGateway(81, { transports: ['websocket'] })
好吧,网关正在监听,但到目前为止我们还没有订阅收到的消息。让我们创建一个处理程序,它将订阅events
消息并使用完全相同的数据响应用户。
events.gateway.ts
JS
@SubscribeMessage('events')
onEvent(client, data: string): string {
return data;
}
提示
该@SubscribeMessage()
装饰器从进口@nestjs/websockets
包。
该onEvent()
函数有两个参数。第一个是特定于库的套接字实例,第二个是从客户端接收的数据。收到消息后,我们会发送一个确认信息,其中包含有人通过网络发送的相同数据。此外,可以使用特定于库的方法发出消息,例如,通过使用client.emit()
方法。但是,在这种情况下,您无法使用拦截器。如果您不想回复用户,则不要返回任何内容(或明确返回“falsy”值,例如undefined
)。
现在,当客户端以下列方式发出消息时:
socket.emit('events', { name: 'Nest' }
该onEvent()
方法将被执行。为了侦听从上面的处理程序中发出的消息,客户端必须附加相应的确认的监听器:
socket.emit('events', { name: 'Nest' }, (data) => console.log(data)
多个回复
确认仅发送一次。此外,本机WebSockets实现不支持它。要解决此限制,您可以返回包含两个属性的对象。在event
其为所发射的事件的名称和data
具有要被转发到客户端。
events.gateway.ts
JS
@SubscribeMessage('events')
onEvent(client, data: any): WsResponse<any> {
const event = 'events';
return { event, data };
}
提示
的WsResponse
接口是从进口@nestjs/websockets
包。
为了侦听传入的响应,客户端必须应用另一个事件侦听器。
socket.on('events', (data) => console.log(data)
异步响应
每个消息处理程序可以是同步或异步
(async
),因此您可以返回Promise
。此外,您可以返回Rx Observable
,这意味着您可以返回多个值(它们将在流完成之前发出)。
events.gateway.ts
JS
@SubscribeMessage('events')
onEvent(client, data: any): Observable<WsResponse<number>> {
const event = 'events';
const response = [1, 2, 3];
return from(response).pipe(
map(data => { event, data })),
}
上面的消息处理程序将响应3次
(顺序,与response
数组中的每个项目)。
生命周期钩子
有3个有用的生命周期钩子。它们都有相应的接口,如下表所示:
OnGatewayInit | 强制实施该afterInit()方法。将特定于库的服务器实例作为参数(如果需要,则传播其余部分)。 |
---|---|
OnGatewayConnection | 强制实施该handleConnection()方法。将特定于库的客户端套接字实例作为参数。 |
OnGatewayDisconnect | 强制实施该handleDisconnect()方法。将特定于库的客户端套接字实例作为参数。 |
提示
每个生命周期接口都从@nestjs/websockets
包中公开。
服务器
有时,您可能希望直接访问本机库特定的
服务器实例。对此对象的引用作为参数传递给afterInit()
方法(OnGatewayInit
接口)。第二种方法是利用@WebSocketServer()
装饰器。
@WebSocketServer() server;
注意
该@WebSocketServer()
装饰器从导入的@nestjs/websockets
包。
Nest准备使用时会自动将服务器实例分配给此属性。