网关

网关

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准备使用时会自动将服务器实例分配给此属性。