套接字多次发出事件

时间:2019-05-22 10:11:13

标签: javascript node.js socket.io chat messaging

我正在使用套接字进行聊天。这是我在nodejs文件中的套接字代码,可以正常工作。

外部套接字io.emit正常工作,并向与该conversationId连接的所有用户发出消息。

但是我用来通知用户的socket.broadcast.emit(当用户使用应用程序时)多次发出(socket.broadcast.emit)事件。为什么会这样呢?我完全错过了套接字方法吗?

socket.on('sendMessage', async(action2) => {
  try {
    action2.author = socket.decoded.id
    action2.readBy = [socket.decoded.id]
    action2.deliveredTo = [socket.decoded.id]
    const createMessage = await Message.create(action2)

    const sender = await User.findOne({ _id: socket.decoded.id }, { firstName: 1 })

    const memebers = //some api call to get members
    const promises = members.map(async(member) => {
      // socket for message
      const socketNotification = {
        // my object
      }
      console.log(socketNotification, 'socketNotifcication')
      socket.broadcast.emit(`messageSocket${member.memberId}`, socketNotification)
    })
    await Promise.all(promises)
    io.emit(action2.conversationId, messages) // "newMessage"
  } catch (err) {
    throw err
  }
})

2 个答案:

答案 0 :(得分:1)

从“广播”文档中:

  

为事件数据的后续事件发射设置修饰符   只会向除发送方以外的所有套接字广播。

https://socket.io/docs/server-api/#Flag-%E2%80%98broadcast%E2%80%99

因此,在您的循环中,您说的是发送给每个人(原始套接字除外),并且您多次调用了该套接字。您想使用什么it.to

io.to(membersSocketID).emit('eventName', socketNotification)

从您的示例中尚不清楚,messageSocket${member.memberId}是否应该作为您指定的socket.id的事件名称。

这是这个https://socket.io/docs/emit-cheatsheet/

的出色秘诀

请注意,如果要获取成员ID的api调用很重要,则最好使用Rooms / namespaces,并在connect上执行该查询以确定房间。

答案 1 :(得分:0)

使用io.to(messageSocket${member.memberId}).emit()代替socket.broadcast.emit()