【问题标题】:SocketIO emitting message to rooms doesn't work correctly向房间发送消息的 SocketIO 无法正常工作
【发布时间】:2020-12-20 21:33:04
【问题描述】:

我正在创建一个允许用户与其他个人用户进行对话的应用。 作为应用程序的用户,每当我与之交谈的人连接到应用程序时,我都希望收到一条消息,提醒我他在线。 为此,我将 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 
    });
};

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

我在这里做错了什么?

【问题讨论】:

    标签: node.js reactjs socket.io


    【解决方案1】:

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

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

    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!`);
      });
    

    【讨论】:

    • 我将代码缩短到相关部分,但套接字确实连接到服务器,因为它确实触发了“在线”事件,但只是向不相关的用户显示它。
    • 另外,我确实加入了房间,只是我忘记将它添加到这里的代码中,对不起!已编辑。
    • 也许您可以在应该接收它的用户的数据库中保留一个数组,并循环遍历每个以加入特定的房间。
    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    相关资源
    最近更新 更多