首页 > 解决方案 > 向房间发送消息的 SocketIO 无法正常工作

问题描述

我正在创建一个应用程序,允许用户与其他个人用户进行对话。作为应用程序中的用户,每当我与之交谈的人连接到应用程序时,我都希望收到一条消息,提醒我他在线。为此,我将 node.js 与 socketIO 一起使用并做出反应。

我在服务器中实现以下内容的方式是:

const socketio = require('socket.io');
const io = socketio(server);

io.on('connection', async (socket) => {
    const { user } = socket.request;

    const userConversationIds = user.conversations;
    socket.join(conversationIds);

    let ioToConversations = io;
    userConversationIds.forEach((conversationId) => {
        ioToConversations = ioToConversations.to(conversationId);
    });

    ioToConversations.emit('online', `${user.firstName} ${user.lastName} is now online!`);
});

在客户端:

import io from 'socket.io-client';
const socket = io();

componentDidMount () => {
    socket.on('online', (messageText) => {
        console.log(messageText); // eslint-disable-line 
    });
};

以上所有都导致了“用户现在在线”消息,发送给现在连接的用户本身。我希望对话中的其他用户有该消息,而连接的用户本身没有

我在这里做错了什么?

标签: node.jsreactjssocket.io

解决方案


一个错误可能是您没有正确连接到服务器,<port>假设您在本地运行,您需要使用此代码进行连接并替换为您的端口号: io.connect("http://localhost:<port>")

另一个错误可能是您没有同时使用该.io()方法.emit()。我的意思是您.emit()在 forEach 循环之后使用了该方法。您可以尝试这样做:

io.on("connection", async (socket) => {
  const { user } = socket.request;
  const userConversationIds = user.conversations;

  let ioToConversations = io;

  userConversationIds.forEach((conversationId) => {
    ioToConversations = ioToConversations
      .to(conversationId)
      .emit("online", `${user.firstName} ${user.lastName} is now online!`);
  });
});

另一个错误可能是因为您没有使用该.join()方法使每个用户的套接字加入特定房间。您可以通过以下方式做到这一点:

userConversationIds.forEach((conversationId) => {
    socket.join(conversationId);
  });

这段代码应该放在forEach发出消息的循环之前。您也可以同时加入和发射,但是我没有使用以下内容进行测试:

userConversationIds.forEach((conversationId) => {
    socket.join(conversationId);

    ioToConversations = ioToConversations
      .to(conversationId)
      .emit("online", `${user.firstName} ${user.lastName} is now online!`);
  });

推荐阅读