套接字 io 不向房间发送消息
socket io not emitting messages to rooms
我被这个问题困扰了一段时间。当新客户端加入房间时,我想向房间的所有已连接客户端发送消息。我已经看到 https://socket.io/docs/v3/emit-cheatsheet/index.html 并尝试了房间的所有发射方法,如下面的服务器代码所示,其中 none 有效,但发射到所有连接的客户端而不是特定房间的方法除外。
服务器代码
socket.on("newUser", (data) => {
socket.join(data.sessionId);
//not a single one of these works to emit to a specific room
socket.broadcast.to(data.sessionId).emit("userJoin", data);
io.to(data.sessionId).emit("userJoin", data);
io.in(data.sessionId).emit("userJoin", data);
io.sockets.in(data.sessionId).emit("userJoin", data);
//only this works but send to all the clients
io.emit("userJoin", data);
});
客户代码
//simply adds a div with info to inform other users that a new user has joined
//works only on io.emit() which emits to all the connected clients of every room
socket.on("userJoin",(data)=>{
const users=document.getElementById('users');
const noUsers=document.getElementById('noUsers');
if(data.action==='join'){
const user = document.createElement('article');
user.classList.add('card');
user.classList.add('lobby-item');
user.innerHTML=`<header class='card__header'>
<h1 class='session__id'>
${data.user.name}
</h1>
</header>`;
users.appendChild(user);
}
});
我认为所有房间发射方法都不起作用的问题可能是房间的构造有误,或者 empty.But 仍然 none 的房间方法在这里起作用。
不要处理覆盖套接字事件名称并检查数据对象是否已正确发送
例子
io.to(data.sessionId).emit("userRoomJoin", data);
io.emit("userJoin", data);
拆分套接字事件名称。
如果还是不行。
console.log(data.sessionId);
检查数据对象是否未定义。
当您在代码中使用对象时,请尝试检查它是否未定义!
所以试试这个命令:
console.log(data);
在套接字 io 中,如果有来自应用程序的重定向或来自客户端的刷新,则会创建一个新的 socket.id,这意味着旧套接字已断开连接并创建了一个新套接字。
在我的应用程序中,我首先在加入路线上执行 socket.emit()
,然后将用户重定向到不同的大厅路线,这意味着加入房间的插座由于重定向到大厅而已断开连接并创建了一个不在任何房间的新插座。
因此 io.to(data.sessionId).emit()
无法正常工作,因为所有连接到房间的插座都因重定向而断开连接。 io.emit()
向当前连接的所有套接字发送时工作
我被这个问题困扰了一段时间。当新客户端加入房间时,我想向房间的所有已连接客户端发送消息。我已经看到 https://socket.io/docs/v3/emit-cheatsheet/index.html 并尝试了房间的所有发射方法,如下面的服务器代码所示,其中 none 有效,但发射到所有连接的客户端而不是特定房间的方法除外。
服务器代码
socket.on("newUser", (data) => {
socket.join(data.sessionId);
//not a single one of these works to emit to a specific room
socket.broadcast.to(data.sessionId).emit("userJoin", data);
io.to(data.sessionId).emit("userJoin", data);
io.in(data.sessionId).emit("userJoin", data);
io.sockets.in(data.sessionId).emit("userJoin", data);
//only this works but send to all the clients
io.emit("userJoin", data);
});
客户代码
//simply adds a div with info to inform other users that a new user has joined
//works only on io.emit() which emits to all the connected clients of every room
socket.on("userJoin",(data)=>{
const users=document.getElementById('users');
const noUsers=document.getElementById('noUsers');
if(data.action==='join'){
const user = document.createElement('article');
user.classList.add('card');
user.classList.add('lobby-item');
user.innerHTML=`<header class='card__header'>
<h1 class='session__id'>
${data.user.name}
</h1>
</header>`;
users.appendChild(user);
}
});
我认为所有房间发射方法都不起作用的问题可能是房间的构造有误,或者 empty.But 仍然 none 的房间方法在这里起作用。
不要处理覆盖套接字事件名称并检查数据对象是否已正确发送
例子
io.to(data.sessionId).emit("userRoomJoin", data);
io.emit("userJoin", data);
拆分套接字事件名称。
如果还是不行。
console.log(data.sessionId);
检查数据对象是否未定义。
当您在代码中使用对象时,请尝试检查它是否未定义!
所以试试这个命令:
console.log(data);
在套接字 io 中,如果有来自应用程序的重定向或来自客户端的刷新,则会创建一个新的 socket.id,这意味着旧套接字已断开连接并创建了一个新套接字。
在我的应用程序中,我首先在加入路线上执行 socket.emit()
,然后将用户重定向到不同的大厅路线,这意味着加入房间的插座由于重定向到大厅而已断开连接并创建了一个不在任何房间的新插座。
因此 io.to(data.sessionId).emit()
无法正常工作,因为所有连接到房间的插座都因重定向而断开连接。 io.emit()
向当前连接的所有套接字发送时工作