socket.io - 停止接收自己的发出

时间:2017-08-24 16:21:30

标签: javascript websocket socket.io

TL; DR - 如何防止客户端收到自己的消息?

根据我对apollographql的体验,我正在使用socket.io。

我的简单服务器如下所示:

io.on('connection', (socket) => {
  console.log('New connection established.');
  socket.on('disconnect', () => {
    console.log('User disconnected.');
  });
  // Projects:
  socket.on('join project', (data) => {
    console.log(`User (${data.user.email}) join project with ID ${data.project.id}`);
    socket.join(data.project.id);
  });
  socket.on('leave project', (data) => {
    socket.leave(data.project.id);
  });

  socket.on('change field', (data) => {
    console.log('Field was changed:', data);
    const { project } = data;
    socket.to(project.id).broadcast.emit('field changed', data);
  });
});

我在我的应用程序中发出了类似的内容:

socket.emit('change field', {
          project: {
            id: 1,
          },
          value: 'Hello world',
          usersEmail: 'example@email.com',
          fieldName: 'description',
        });
socket.on('field changed', (data) => {
      // if (data.usersEmail === 'example@email.com') return; // This would stop from receiving own messages
      console.log('CLIENT: field was changed!', data);
    });

我认为会发生(由于我在broadcast中设置的on('change field', ...)标记):

  1. 客户端A发出消息
  2. A以外的客户端收到消息
  3. 正在发生的事情是其他客户端和客户端A本身的日志,说该字段已更改。我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我遇到了完全相同的问题。无法(或者没有尽力)找到它的设置,所以只需在页面加载时将其添加到我的客户端:

Connected

然后,将其添加到您在客户端中发出的消息中:

document.windowid = Math.round(Math.random() * 1000000000000);

然后,当您接受客户端上的数据时,仅在windowid不相同时执行操作:

windowid: document.windowid

这不是很好,socket.io应该处理这个问题,但这是我在我的应用程序中使用的解决方案:)