为什么Socket.IO中循环调用socket.broadcast.to指定ID广播无法生效
问题成因
语法错误导致代码完全不执行
你提供的循环代码末尾缺失了for循环对应的闭合大括号},属于基础语法错误,会导致JS引擎解析代码时直接抛出异常,整个逻辑块不会运行,自然无法发出任何广播消息,这是最常见的故障原因。房间名参数传入不匹配
你的初始实现中,socket.broadcast.to(admins)的入参admins是存储目标房间标识的变量,而循环写法中to(rolename)传入的是roles对象的键名字符串(即固定值"nonmods"、"mods"、"admins")。如果你的admins/mods/nonmods变量实际存储的房间标识和这三个字符串不一致,就会指向不存在的房间,导致消息没有接收对象。
修复参考
如果你的房间标识和角色名字符串一致,补全循环闭合大括号即可:
let roles = {nonmods : usersnonmod, mods : usersmod, admins : usersadmin} for(let rolename in roles) { if (roles.hasOwnProperty(rolename)) { // 过滤原型链继承的多余属性 socket.broadcast.to(rolename).emit('login', { onlineusers: roles[rolename] }); } }
如果房间标识和角色名字符串不一致,改用数组存储映射关系更稳妥:
const roleList = [ { roomId: admins, userList: usersadmin }, { roomId: mods, userList: usersmod }, { roomId: nonmods, userList: usersnonmod } ] roleList.forEach(item => { socket.broadcast.to(item.roomId).emit('login', { onlineusers: item.userList }) })
内容的提问来源于stack exchange,提问作者user9638079
相关产品推荐
相关产品推荐

