首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向客户端广播NestJS websocket事件

向客户端广播NestJS websocket事件
EN

Stack Overflow用户
提问于 2018-12-04 09:35:59
回答 3查看 15.4K关注 0票数 11

我无法通过websocket从服务器NestJS向客户端发送数据。什么都没有发出。

我的用例:

  • 通过websocket连接到服务器的几个客户端
  • 客户端通过websocket向服务器发送消息。
  • 服务器将消息广播给所有客户端。

My堆栈:

  • 带websocket的NestJS服务器
  • 和其他(比如用于测试websockets的chrome扩展)

我的代码:

简单-web-套接字.网关.web:

代码语言:javascript
运行
复制
import { SubscribeMessage, WebSocketGateway, WsResponse, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit } from '@nestjs/websockets';

@WebSocketGateway({ port: 9995, transports: ['websocket'] })
export class SimpleWebSocketGateway implements OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit {

  @WebSocketServer() private server: any;
  wsClients=[];
  afterInit() {
    this.server.emit('testing', { do: 'stuff' });
  }

  handleConnection(client: any) {
    this.wsClients.push(client);
  }

  handleDisconnect(client) {
    for (let i = 0; i < this.wsClients.length; i++) {
      if (this.wsClients[i].id === client.id) {
        this.wsClients.splice(i, 1);
        break;
      }
    }
    this.broadcast('disconnect',{});
  }
  private broadcast(event, message: any) {
    const broadCastMessage = JSON.stringify(message);
    for (let c of this.wsClients) {
      c.emit(event, broadCastMessage);
    }
  }

  @SubscribeMessage('my-event')
  onChgEvent(client: any, payload: any) {
    this.broadcast('my-event',payload);
  }
}

main.ts:

代码语言:javascript
运行
复制
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { WsAdapter } from '@nestjs/websockets';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useWebSocketAdapter(new WsAdapter());
  await app.listen(3000);
}
bootstrap();

app.module.ts:

代码语言:javascript
运行
复制
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { SimpleWebSocketGateway } from 'simple-web-socket/simple-web-socket.gateway';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService, SimpleWebSocketGateway],
})
export class AppModule {}

加性信息:

客户端发射(使用代码行c.emit(事件,broadCastMessage);)返回false。

我怀疑框架中有错误,因为我的用法非常简单。但如果我做错了什么,我想再和这里的社区核实一下。

EN

回答 3

Stack Overflow用户

发布于 2018-12-11 17:15:24

正如在前面的评论中提到的,c.send()可以很好地处理以下代码片段:

代码语言:javascript
运行
复制
import { SubscribeMessage, WebSocketGateway, WsResponse, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit } from '@nestjs/websockets';

@WebSocketGateway({ port: 9995, transports: ['websocket'] })
export class SimpleWebSocketGateway implements OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit {

  @WebSocketServer() private server: any;
  wsClients=[];
  afterInit() {
    this.server.emit('testing', { do: 'stuff' });
  }

  handleConnection(client: any) {
    this.wsClients.push(client);
  }

  handleDisconnect(client) {
    for (let i = 0; i < this.wsClients.length; i++) {
      if (this.wsClients[i] === client) {
        this.wsClients.splice(i, 1);
        break;
      }
    }
    this.broadcast('disconnect',{});
  }
  private broadcast(event, message: any) {
    const broadCastMessage = JSON.stringify(message);
    for (let c of this.wsClients) {
      c.send(event, broadCastMessage);
    }
  }

  @SubscribeMessage('my-event')
  onChgEvent(client: any, payload: any) {
    this.broadcast('my-event',payload);
  }
}
票数 11
EN

Stack Overflow用户

发布于 2020-12-13 14:04:01

我试图使用client.send()向所有连接的客户端广播一条消息

代码语言:javascript
运行
复制
broadcastMessage(event: string, payload: any) {
  for (const client of this.clients) {
    client.send(event, payload);
  }
}

testBroadcast() {
  this.broadcastMessage('msgInfo', { name: 'foo' });
}

发送的数据最后看起来如下:

代码语言:javascript
运行
复制
["message", "msgInfo", { "name": "foo" }]

上面的方法对我不起作用,所以我使用了工作正常的client.emit()

代码语言:javascript
运行
复制
broadcastMessage(event: string, payload: any) {
  for (const client of this.clients) {
    client.emit(event, payload);
  }
}

现在的数据如下:

代码语言:javascript
运行
复制
["msgInfo", { "name": "foo" }]
票数 3
EN

Stack Overflow用户

发布于 2021-01-26 21:03:36

使用socket.io,我们可以使用socket.broadcast.emit()?:

代码语言:javascript
运行
复制
@SubscribeMessage('my-event')
onChgEvent(
    @MessageBody() message: any,
    @ConnectedSocket() socket: Socket,
): void {
   socket.broadcast.emit('my-event', message);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53609737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档