[英]Socket.io + express rooms
我正在一个实时聊天的在线网站上工作,我一直在尝试设置socket.io房间几天,但我的一个自定义事件不会发出。
我的网站有2条路径, /
和/play
。 当某人填写/
path中的表单时,网站会将其重定向到/play
路径。
const io = require('socket.io')(listener);
io.on('connection', socket => {
socket.on('add user', data => { // This event gets emitted when the user submits the form at `/`, in a client-side js file.
socket.username = data.username;
socket.room = data.room;
socket.score = 0;
socket.join(data.room);
io.sockets.in(data.room).emit('user joined', { // This event gets 'handled', in another (not the same one) client-size js file.
username: data.username,
room: data.room
});
});
socket.on('disconnect', function () {
io.sockets.in(socket.room).emit('user left', {
username: socket.username,
room: socket.room
});
socket.leave(socket.room)
});
});
在另一个客户端js文件中:
var socket = io.connect();
let joined = 0;
socket.on('user joined', data => {
joined++;
console.log(joined, data)
const elemental = document.createElement("LI");
const info = document.createTextNode(data.username);
elemental.appendChild(info);
document.getElementById('people').appendChild(info)
});
添加用户事件代码执行得很好,但用户加入的不是..我几乎可以肯定它与路径有关。 我读了socket.io命名空间,但看起来它们就像一个不同类型的房间。 有人能告诉我什么是错的吗?
编辑:我应该提到没有错误出现。
在没有看到你的整个代码的情况下,我将假设client-side.js
代码上的套接字没有连接到data.room
会议室,这就是为什么你没有在'user join'
事件监听器上得到任何东西的原因这是因为您可能在客户端代码上有多个socket.io
连接。
您有多种方法可以解决这个问题,具体取决于您要实现的目标。
io.emit('user joined')
而不是io.sockets.in(data.room)...
var socket = io.connect();
在前端,否则是发出的套接字: add user
并因此加入到data.room
不是正在监听的套接字: user joined
,这就是为什么你永远不会在该套接字上获取事件,因为你有2个不同的套接字,一个加入房间的人,除了等待永远不会发生的事件之外什么都没做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.