我正在使用套接字进行聊天。这是我在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
}
})
答案 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()