node.js - 套接字发送到房间适用于除发送者之外的所有套接字

标签 node.js express socket.io

我正在使用 socket.io 创建投票功能。套接字通过channelId放置到房间中。每当房间中的任何套接字发出 vote 事件时,我都会尝试向该房间中的所有套接字发出当前的 vote-list

我的问题是,如果我在同一个房间里有套接字 A、B、C,则 B 和 C 可以看到来自套接字 A 的投票(即 B 和 C 的 on.('vote') 监听器被调用),但不是 A 本身。

我期望发生的是,如果套接字 A、B、C 在同一个房间,并且 A 发出投票,则所有套接字 A、B、C 投票 将调用监听器。

客户:

这些监听器是在方法中定义的,但为了清楚起见,我将它们单独列出。所有变量均已定义。

const socket = io('https://localhost:3001')

socket.emit('join-channel',{ 
    channelId: payload.channelId,
    senderId: socket.id
 })

socket.emit('vote',{
    senderId: socket.id,
    channelId: state.channelId,
    vote: payload.vote,
    userId: state.userId
})

socket.on(`vote`, function (data) {
    store.commit(MUTATIONS.SET_VOTES, data)
});

服务器

module.exports = (应用程序,服务器) => { var io = require('socket.io')(服务器);

io.on('connection', function (socket) {

    socket.on('join-channel',data=>{
        socket.join(data.channelId)
    })

    socket.on('vote',data=>{
        postVote(data)
        let { channelId } = data

        socket.to(channelId).emit(`vote`,STORE[channelId])
        //socket.emit(`vote`,STORE[channelId]) //My workaround so that the socket's messages are emitted back to itself
    })


});

};

我当前的解决方法是添加 socket.emit('vote',STORE[channelId]),以便它可以将数据发送回自身。

最佳答案

这是socket.io API 中设计的。您使用的此表单:

socket.to(channelId).emit(...)

专门设计用于发送到channelId房间中除socket之外的所有套接字。

如果您想发送给该房间中的所有用户,请将上面的代码更改为:

io.to(channelId).emit(...)
<小时/>

这里引用 socket.io doc for socket.to() :

Sets a modifier for a subsequent event emission that the event will only be broadcasted to clients that have joined the given room (the socket itself being excluded).

关于node.js - 套接字发送到房间适用于除发送者之外的所有套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46210594/

相关文章:

node.js - 没有获得 req header 授权 token

javascript - 无法在网页上获取 m4a 音频文件的长度

android - 如何从 Android 应用程序将倒数计时器与服务器同步

javascript - socket.io:点击时发出按钮的属性值?

node.js - 尽管发送了状态代码,为什么我在发送后仍收到 "Error: Can' t set headers?

node.js - 如何在测试中将多个套接字连接到 sails

node.js - 使用 Lambda 函数 Node.js 创建 Athena 表

javascript - Node - 将函数插入数组以与 Promise.all 一起使用

node.js - 迭代数组时超测双重回调

node.js - 在node.js中使用express.logger记录错误