当前位置: 首页 > 知识库问答 >
问题:

加入和发射到NestJs中带有Socket IO的房间

景嘉志
2023-03-14

我试图做一个简单的房间在nestjs与soketio和不能掌握一个房间的概念。我想要的是客户端发送一个ID到一个一般的endpoint,然后服务器将加入该套接字到一个特定的房间,然后开始从其他地方向该房间发送消息。我目前有的是客户加入一个名为“会议”的活动,然后被发送一个假会议,但我不知道如何让多个客户加入同一个房间,同时被发送相同的信息。

客户端(html

  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.1/socket.io.js"></script>
  <script>
    const url = 'http://localhost:4001';
    const socket = io(url); 
      socket.on('connect', function() {
        console.log('Connected');
        socket.emit('meeting', { roomId: '12345' });
      });
      socket.on('meeting', function(data) {
        console.log('you have joined the meeting: ', data);
      });
      socket.on('exception', function(data) {
        console.log('event', data);
      });
      socket.on('disconnect', function() {
        console.log('Disconnected');
      });
  </script>

服务器(NestJS):

@WebSocketGateway(4001)
export class PackGateway implements OnGatewayConnection {

  constructor(private otherService: OtherService) {}

  @WebSocketServer()
  server: Server;

  handleConnection() {
    console.log('new connection!');
  }

  @SubscribeMessage('meeting')
  joinUserToMeeting(@MessageBody() data: any, @ConnectedSocket() client: Socket): Observable<WsResponse<any>> {
    client.join(data.roomId, (err) => {
      if (err) {
        console.log('error ', err);
      } else {
        console.log('client joined room: ' + data.roomId);
        this.server.to(data.meetingId).emit('a new challenger approaches');
      }
    });
    return from(data.meetingId)
    .pipe(
      map(
        (res: any) => {
          return {
            event: 'meeting',
            data: data.meetingId
          }
        }
      )
    );
  }
}

通过此设置,我的客户将连接到会议活动,加入到他们连接到会议活动时发送的roomId,并返回他们已加入的meetingId。但是,我遗漏了一个关键点:

  1. 客户端尚未实际打开与服务器加入的房间的连接。我是否需要在客户端代码中执行此操作才能启动到特定房间id的连接?一旦我可以像下面这样工作,我想我的客户机在任何客户机加入后都会收到一条消息,因为服务器在建立新连接时会向该房间发出一条消息
    <script>
    const url = 'http://localhost:4001';
    const socket = io(url);
    socket.on('connect', function () {
      console.log('Connected');
      socket.emit('meeting', { meetingId: '12345' });
    });
    socket.on('meeting', function (data) {
      console.log('you have joined the meeting: ', data);
      socket.in(data).on('roomIdEvent', function (data) {
        console.log('you got a new event specific to the meeting you joined');
        console.log('data');
      });
    });
    socket.on('exception', function (data) {
      console.log('event', data);
    });
    socket.on('disconnect', function () {
      console.log('Disconnected');
    });
  </script>

共有1个答案

余阳秋
2023-03-14

所以

this.server.to(data.meetingId).emit('a new challenger approaches');

this.server.to(data.meetingId).emit('meeting', 'a new challenger approaches');

现在,由于我的服务器已将客户机加入到该会议室,因此通过会议室发送到会议室可以让我的客户机查看数据

 类似资料:
  • 我正在按照NestJS文档创建事件发射器(文档链接)。当我运行代码时,我得到一个错误: [Nest]129586-16/06/2021,20:43:31[ExceptionHandler]this.eventEmitter.emit不是函数 这就是我的代码的样子: 我不确定我错过了什么。

  • 每当在服务器上删除时,我还想从中删除一个适当的实体。为此,我可以使用并且每当数据库中不再存在父时,也会被删除。听起来不错。 每当我使用更新数据库中的福利时,就会出现问题实际上执行和操作,但是会在内部触发的,因此,该表中的所有数据也会被删除。 (类似的问题出现在和表格上。) 我正在寻找一种在事务结束前暂时禁用外键约束的方法。也就是说,不要在事务期间验证外键,而只在事务结束时验证外键。我仍然希望房间自

  • 我有一个DAO接口,其中有多个实现,我希望其中一个是Room实现(Kotlin):

  • 问题内容: 我正在尝试通过构建一组动态创建的聊天室来学习Socket.io,这些聊天室在用户进入和离开时会发出“已连接”和“已断开”消息。看着问题,我已经把一些功能,但大多数链接的响应是从谁承认自己已成功侵入一起答案的人,我已经注意到有一个更普遍的-和最近- 有关的权利的方式来讨论在Socket.io存储库上执行此操作(尤其是在此处和此处) 因为我是个新手,所以我不知道下面的工作是否是可以接受的处

  • 我环顾了这里和其他网站,但我想不出解决办法。 一切正常,直到我初始化中的。 我一直在犯这个错误 我有这个格里德尔 当我添加插件和时,它说它们找不到。 但那给了我这些错误 在数据库文件中,我做了如下操作: 并将所有东西连接到RoomViewModel(我也为它创建了一个工厂) 这是我做的 我认为上下文有问题,但我真的不知道。还在学习。。。 请帮帮忙

  • 我使用的是socket.io/node.js/express。当我使用socket.join(“room”)加入socket.io房间时,它会注册该房间,但用户只加入“room”。 这个命令显示了所有的房间,它同时返回'room'和'',尽管我从未创建过'room: 任何帮助都将不胜感激,这是非常奇怪的行为:( 编辑:以下是相关的服务器代码