Событие генерации сокета несколько раз - PullRequest
6 голосов
/ 22 мая 2019

Я работаю над сокетом для чата.Вот мой код сокета в файле 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 ]

1 голос
/ 28 мая 2019

Из документов Broadcast:

Устанавливает модификатор для последующего выброса события, чтобы данные события передавались только на все сокеты, кроме отправителя.

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/

Примечание: если ваш вызов API для получения идентификаторов участника важен, вам лучше использовать комнаты / пространства имен и выполнить этот запрос при подключении, чтобы определить комнаты.

0 голосов
/ 22 мая 2019

используйте io.to(messageSocket${member.memberId}).emit() вместо socket.broadcast.emit()

...