NodeJS Socket.IO的io.emit可以工作,但是socket.emit /io.to().emit /io.in().emit不行

vhipe2zx  于 9个月前  发布在  Node.js
关注(0)|答案(1)|浏览(142)

我正在尝试做一个简单的即时消息应用程序,我一直在努力让WebSocket部分工作。我发现客户端可以成功地向服务器发送请求,但当我试图让服务器发送回客户端时,它只能使用io.emit而不是socket.emit,当我试图使用to()或in()使其发送到特定房间时,即使使用io.emit也不起作用,我需要它这样做。相反,它为那些超时。
委托方:

const socket = io('http://localhost:3000');
  
      socket.on('connect', () => {
        console.log('connected to socket');
      });
  
      socket.on('chat-message-out', (msg) => {
        console.log('incoming message thru socket: ', msg);
        setConvoMessages((prevMessages) => [msg, ...prevMessages]);
      });
  
    const sendMessage = (message, recipient) => {
      socket.emit('chat-message-in', message, recipient);
    };

    const joinRoom = (convoId) => {
      
      socket.emit('join-room', convoId);
      console.log('joining room ', convoId);
    };

字符串
伺服器:

io.on('connection', (socket) => {
  console.log(`User connected with socket ID: ${socket.id}`);

  socket.on('chat-message-in', (message, convoId) => {
    console.log(`User ${socket.id} sending message to conversation ${convoId}: ${message.msgtext}`);
    io.to(convoId).emit('chat-message-out', message, (error) => {
      if (error) {
        console.error('Error sending message:', error);
      } else {
        console.log('Message sent successfully');
      }
    });
    
  });

  socket.on('join-room', (convoId) => {
    console.log(`User ${socket.id} joined conversation ${convoId}`);
    socket.join(convoId);
  });

  socket.on('disconnect', () => {
    console.log(`User ${socket.id} disconnected`)
  });
});

instrument(io, {
  auth: false,
});


为此,我的服务器记录:

User cW-J0NoNfpTTMjMKAAAL sending message to conversation BhzO0KukuC4zHb3o: dumb
Error sending message: Error: operation has timed out
    at Timeout._onTimeout (/home/rvcross/repos/messaging-app/server/node_modules/socket.io/dist/broadcast-operator.js:182:17)
    at listOnTimeout (node:internal/timers:569:17)
    at process.processTimers (node:internal/timers:512:7)


但是如果我删除to()部分,它将成功地将消息发送到所有套接字。
“user _ sending message to conversation”部分被正确注销,这是值得的。
我已经使用了Admin-UI来确认套接字实际上在房间中(convoId),所以我不认为这是问题所在。
任何帮助将不胜感激!

bkhjykvo

bkhjykvo1#

好吧,我似乎已经让它工作了。客户端是用React编写的,我在useEffect中使用了大部分套接字,但没有声明socket = io('http://localhost:3000 '),我只是在顶部与我的进口.每当组件重新渲染它会创建一个不同的套接字连接,但以前的连接创建的以前的渲染仍然存在.我不完全确定这是如何导致我的问题,但无论如何,移动套接字声明内useEffect得到了to().emit正常工作,虽然我的服务器仍然给我超时错误消息。

相关问题