websocket 如何从nestjs服务传递socket客户端连接

egdjgwm8  于 2023-03-12  发布在  其他
关注(0)|答案(2)|浏览(530)

我想把连接的socket客户端传递给nest js服务,我参考了这个问题https://stackoverflow.com/question....,但是我不明白如何从我的服务传递client:Socket
我有一个处理一些文件处理任务的公牛队列。一旦文件处理完成。我想通知谁发送该文件的用户。下面是我的WebSocket网关。在这里notifyJobStatus被调用一旦工作完成。但我想将其发送到一个特定的客户端。为此,我需要从我的服务访问客户端。然后我可以将方法修改为类似于notifyJobStatus(status: string, client: Socket)的内容。如果这种方法是错误的,请纠正我。

export class NotificationsService
  implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect
{
  @WebSocketServer() server: Server;
  private readonly logger = new Logger(NotificationsService.name);

  notifyJobStatus(status: string) {
    //client.broadcast.to(client.id).emit('JobStatus', status);
    this.server.emit('JobStatus', status);
  }

  afterInit() {
    this.logger.log('Websocket Server Started,Listening on Port:3006');
  }

  handleDisconnect(client: Socket) {
    console.log(`Client disconnected: ${client.id}`);
  }

  handleConnection(client: Socket, ...args: any[]) {
    console.log(`Client connected: ${client.id}`);
  }
}
2g32fytz

2g32fytz1#

这对我有效,对你也应该有效。假设我们有notifyModule,我想调用OrderModule中的队列
1.我在模块中导出了NotifyConsumer
1.然后我在订单模块中注册了队列,别忘了,它也注册在您的NotifyModule中。

BullModule.registerQueue({
      name: 'order-queue',
    }),
    BullModule.registerQueue({
      name: 'notify-queue',
    }),

注意:order-queue与答案无关,我只是复制了我的代码给你。
然后,我将notify-queue导入到我需要的订单控制器文件中

@InjectQueue('notify-queue') private notifyQueue: Queue,

最后,我用了它,它的工作

// send latest notification
      await this.notifyQueue.add('notify', {
        ...
      });
p5fdfcr1

p5fdfcr12#

如果这是您的网关,我猜它没有正确设置。NESTJS中的网关采用以下格式:

@WebSocketGateway()
export class NotificationsService
  implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect
{
  @WebSocketServer() server: Server;
  private readonly logger = new Logger(NotificationsService.name);

  @SubscribeMessage('event to listen to')
  notifyJobStatus(status: string) {
    //client.broadcast.to(client.id).emit('JobStatus', status);
    this.server.emit('JobStatus', status);
  }

  afterInit() {
    this.logger.log('Websocket Server Started,Listening on Port:3006');
  }

  handleDisconnect(client: Socket) {
    console.log(`Client disconnected: ${client.id}`);
  }

  handleConnection(client: Socket, ...args: any[]) {
    console.log(`Client connected: ${client.id}`);
  }
}

同时,由于您使用的是长队列来处理作业,因此可以从处理作业的长队列使用者发出作业状态,@SubscribeMessage('event to listen to')将侦听该使用者,并调用notifyJobStatus方法将状态发送给用户。

相关问题