Socket.io + Express 房间

3

我正在开发一个实时聊天的在线网站,最近几天一直在尝试设置socket.io房间,但是我的自定义事件就是不能发出。

我的网站有两个路径://play。当有人在/路径中填写表单后,网站会将其重定向到/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 上使用 socket.on('error', console.log); 吗? - Marcos Casagrande
刚试了一下,什么也没发生。 - Mxm
好的,我现在明白你的问题了。 - Marcos Casagrande
1个回答

1
没有看到你的全部代码,我假设在 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 不同,这就是为什么你永远不会在那个套接字上得到事件的原因,因为你有两个不同的套接字,一个加入了房间,另一个除了等待永远不会发生的事件之外什么也不做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接