Javascript Socket.io向所有客户端发送消息,但最初发送原始消息的客户端除外

Javascript Socket.io向所有客户端发送消息,但最初发送原始消息的客户端除外,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我有两个或多个客户端连接到Socket.io文件室,客户端#1发出如下消息: export function appendChild({ item }){ socket.emit(APPEND_CHILD, { item }) return { type: APPEND_CHILD, } } 此消息已成功发送到服务器,如下所示: socket.on('APPEND_CHILD', async ({ item }) => { ... socket.in(sock

我有两个或多个客户端连接到Socket.io文件室,客户端#1发出如下消息:

export function appendChild({ item }){
  socket.emit(APPEND_CHILD, { item })
  return {
    type: APPEND_CHILD,
  }
}
此消息已成功发送到服务器,如下所示:

socket.on('APPEND_CHILD', async ({ item }) => {
  ...
  socket.in(socket.handshake.query.room).emit('APPEND_CHILD_AFTER_EFFECT', { payload: { log, parentLog }, socketId: socket.id })
})
请注意,要触发此操作,我使用一种消息类型,要ping所有客户端以进行更新,我使用不同的消息,当发送时,所有客户端都应该接收到这些消息,并且它们都应该更新其状态

客户端侦听传入的消息,如下所示:

socket.on('APPEND_CHILD_AFTER_EFFECT', ({ payload, socketId }) => {
        console.log('test !')
        ...
      })
除活动客户端(发送初始发射的客户端)外的所有客户端都收到了消息。


为什么主客户端没有收到消息,以及如何做到这一点?

正如Discord的@guico33所指出的,我在向所有客户端发送消息时使用了
socket
对象,而不是
io

io.on('connect', socket => {
    socket.on('event', message => { 
        socket.in(room).emit(...) 
    })
})
应该是这样的:

  io.in(socket.handshake.query.room).emit(message, data)
而不是:

  socket.in(socket.handshake.query.room).emit(message, data)

我不应该使用
socket.in(room).emit(…)
,而应该使用
io.in(room).emit(…)
将响应发送给包括发射器在内的所有人。

在我看来,发送事件的客户端不需要通知似乎是合乎逻辑的…@James在大多数情况下都是这样,但在某些情况下,您需要它,特别是当您需要从服务器获取一些数据时。具体地说,在我的例子中,我需要客户机请求操作,然后服务器将使用客户机的输入并创建对象,然后将该对象发送给所有客户机,以便他们可以更新其UI,包括发送方。(这样我就避免了在创建对象时重复逻辑)