Node.js socket.io不向会议室中的其他人发送事件

Node.js socket.io不向会议室中的其他人发送事件,node.js,vue.js,socket.io,Node.js,Vue.js,Socket.io,所以我试图弄清楚一个非常基本的socket.io应用程序到底发生了什么。我用两个不同的标签来测试这一点,它们注册为不同的用户,并尝试查看另一个是否获得事件。两个前端都没有接收到其他事件,但服务器确实正确地接收到了事件。我的前端是vue.js,我想我的代理设置是正确的。我不确定为什么连到同一个房间的两个人不能收到基于文档的事件 编辑:如果我删除roomId的.to,则消息将仅复制到发送消息的用户:/n不确定这是否意味着什么 Edit2:这与rabbitmq适配器不用于中继消息有关。通过移除中间件,

所以我试图弄清楚一个非常基本的socket.io应用程序到底发生了什么。我用两个不同的标签来测试这一点,它们注册为不同的用户,并尝试查看另一个是否获得事件。两个前端都没有接收到其他事件,但服务器确实正确地接收到了事件。我的前端是vue.js,我想我的代理设置是正确的。我不确定为什么连到同一个房间的两个人不能收到基于文档的事件

编辑:如果我删除roomId的.to,则消息将仅复制到发送消息的用户:/n不确定这是否意味着什么

Edit2:这与rabbitmq适配器不用于中继消息有关。通过移除中间件,一切都能正常工作

Node.js服务器

import http from 'http';
import express from 'express';
import { Server } from 'socket.io';
const adapter = require('socket.io-amqp');

const app = express();
const server = http.createServer(app);
const io = new Server(server,{
  path: '/socket'
});

io.adapter(adapter('amqp://localhost'));

app.get('/',(req,res) => {
    res.send('<h1>Hello World, Again</h1>')
});

io.on('connection',(socket) => {
  
  const query = socket.handshake.query;
  const userId = query['userId'] as string;
  const roomId = query['roomId'] as string;
  if(!userId || !roomId)
  { 
    console.log('failed to connect - userId or roomId is undefined');
    socket.disconnect(); 
    return;
  } 
  
  socket.join(roomId);
  console.log(`connection - user: ${userId}, room: ${roomId}`);

  socket.on('newValue',(e) => {
    socket.to(roomId).emit('newValue',{
      userId: userId,
      value: e.value
    });

    console.log(`roomId: ${roomId}, userId: ${userId}, value: ${e.value}`);
  });

  socket.on('disconnect',(reason)=> {
    socket.to(roomId).emit('userDisconnect',{
      userId: userId
    });

    console.log(`disconnect - user: ${userId}, room: ${roomId}`);
  });

  socket.to(roomId).emit('newUser',{
    userId
  });
});
 
const PORT = 3000;
server.listen(PORT,() => {
    console.log(`listening on http://localhost:${PORT}`);
});
服务器日志

[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node src/index.ts`
listening on http://localhost:3000
connection - user: ls91m4il, room: 123, socketId: 86zN3g6maJu1z0OzAAAB
connection - user: pq68znqa, room: 123, socketId: xvKKzXhEbCrnz_l_AAAD
roomId: 123, userId: ls91m4il, socketId, 86zN3g6maJu1z0OzAAAB value: 5
roomId: 123, userId: pq68znqa, socketId, xvKKzXhEbCrnz_l_AAAD value: 13
onAny或具有匹配命名事件的订阅的事件响应不会触发前端日志。

首先,
socket.to(roomId).emit(…)
将向roomId中的每个套接字发送消息,由
socket
表示的客户端除外。如果要发送到
roomId
中的所有套接字,可以使用
io.to(roomId).emit(…)
。我不清楚您是想发送到所有套接字还是发送到所有套接字,除了发起者,所以我想确保您了解这方面的内容

通过调试和日志记录,您可以了解到一些问题:

  • 确保两个客户端都连接到服务器并保持连接。在
    connect
    disconnect
    事件上记录实际的
    socket.id
    ,可以很好地了解这一点

  • 确保两个客户端请求相同的
    roomId
    。如果每个房间的
    roomId
    不同,则
    roomId
    中只有一个套接字,并且
    socket.to().emit()
    将没有其他人可以发送

  • 确保发送
    newValue
    消息的客户端没有发布表单,该表单会导致页面重新加载,从而断开旧套接字并创建新套接字。登录点#1应确保您不会看到这种情况发生。我之所以提到这一点,主要是因为这是一个常见的错误,尽管我没有看到足够多的实际HTML页面来了解这是否会成为您的问题

  • 在服务器上记录每个传入消息。日志,不仅是消息,还包括它从中到达的
    socket.id
    。这将允许您重构整个消息流


  • 如果没有所有这些数据,我们就没有能力找出问题所在。这类问题需要收集数据,然后跟踪线索,直到您能够更准确地看到发生了什么和没有发生什么。如果我不得不冒险猜测,我想知道您是否对#1或#2有问题。

    摆脱vue内容如果您的问题不是接收消息,那就不相关了。输入一些日志,找出发生了什么和没有发生什么。查看网络选项卡以查看是否收到消息。我的意思是vue.js正在使用代理。。。我不知道这是否相关。代码中有很多日志。消息到达服务器,然后客户端没有收到来自服务器的任何消息。。。我觉得这篇评论是在没有真正注意到我所说的内容的情况下发表的……文章越长,阅读和理解你的实际问题就越困难。在这种情况下,听起来您没有正确使用socket.io api。在这种情况下,第一步是消除所有其他因素,并集中精力使其发挥作用。然后你就可以读vue的东西了。在路上,你可能会发现你的实际问题是什么,并且能够提出一个问题,而不仅仅是“为什么我的代码不能工作?”我记录了除socketId之外的所有东西,我添加了它,但仍然看到了同样的事情。并没有重新连接,消息向下发出newValue,并没有一个客户端得到它。socket.io不能与开发机器上的多个浏览器选项卡一起工作吗?@ChaseRLewis-如果您希望我们能够进一步帮助您,我们需要查看您所说的添加的所有日志。请将代码(包括所有新的
    console.log()
    语句)添加到您的问题中,并添加您在控制台中获得的结果日志。Socket.io可以与多个浏览器选项卡配合使用。@ChaseRLewis-我没有看到任何客户端代码专门侦听服务器在
    Socket.to().emit()中发送的
    newValue
    消息。这当然可以解释为什么你没有收到它。你依赖于
    这个.socket.onAny(…)
    吗?我依赖于any是因为newValue不起作用。我现在已经在代码中添加了这两个选项,两个选项都没有响应。我还添加了请求的服务器日志。未触发前端日志。服务器端代码显示服务器上的新值已触发。@ChaseRLewis-我不知道。当您在服务器上收到
    newValue
    消息时,我会尝试将一些固定消息发送回客户端。例如,执行
    socket.emit('gotNewValue')
    并查看您的客户机是否可以直接从服务器接收任何消息,甚至不涉及房间?为客户端中的
    gotNewValue
    消息注册特定的侦听器。你需要简化,找到一些有用的东西,然后再重新构建。我对代理和自定义适配器所做的工作一点也不熟悉,所以这可能也会影响问题的解决。
    module.exports = {
        devServer: {
          proxy: {
            '/socket': {
              target: 'http://localhost:3000',
              changeOrigin: true,
              ws: true,
            }
          }
        }
      }
    
    [nodemon] 2.0.7
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching path(s): *.*
    [nodemon] watching extensions: ts,json
    [nodemon] starting `ts-node src/index.ts`
    listening on http://localhost:3000
    connection - user: ls91m4il, room: 123, socketId: 86zN3g6maJu1z0OzAAAB
    connection - user: pq68znqa, room: 123, socketId: xvKKzXhEbCrnz_l_AAAD
    roomId: 123, userId: ls91m4il, socketId, 86zN3g6maJu1z0OzAAAB value: 5
    roomId: 123, userId: pq68znqa, socketId, xvKKzXhEbCrnz_l_AAAD value: 13