首页 > 解决方案 > 如何正确发送到插座房?

问题描述

“消息”套接字无法发送到前端。我认为问题源于我的服务器代码,特别是这个块:

socket.to(data.roomId).emit('message', {
    from: data.from,
    body: data.body,
    timestamp: data.timestamp
  });

当我将上面的内容更改为 时socket.emit('message'),会在前端接收并呈现消息。但是,因为不是针对特定的 roomId,所以没有即时聊天功能。我知道 data.roomId 是在正确范围内使用 console.log 的正确 roomId。

服务器 API

io.sockets.on('connection', function (socket) {
//meant to join the socket to the roomId so that messages can be emmitted to the roomId
socket.on('join', function (data) {
      socket.join(data.roomid, () => {
        console.log(data.roomid);
      });
    });

//my Conversation schema holds Message Schemas
socket.on('connected', function (data) {
      //loads all messages already created
      const filter = { roomId: data.roomid };
      (async () => {
        console.log('searching for Schema');
        let conversation = await Conversation.findOne(filter)
          .populate('messages')
          .exec(function (err, message) {
            if (message) {
              const array = message.messages;
              console.log(array);
              socket.emit('send', { arra: array }); //sends previous conversation
            } else {
              console.log('Schema not found');
            }
          });
      })();
    });

    socket.on('server:message', (data) => {
      const filter = { roomId: data.roomId };
      const message = new Message({
        from: data.from,
        body: data.body,
        timestamp: data.timestamp
      });

      (async () => {
        console.log('searching for Schema');

        let conversation = await Conversation.findOneAndUpdate(filter, {
          $push: { messages: message }
        });

        if (conversation == null) {
          console.log('Schema being created');
          (await Conversation.create(filter)).populate('messages');
          message.save(function (err) {
            if (err) console.log('an error has occured saving the message');
            // saved!
          });
          await Conversation.findOneAndUpdate(filter, {
            $push: { messages: message }
          });
          let updatedConversation = await Conversation.findOne(filter);
        } else {
          console.log('Schema found');
          let updatedConversation = await Conversation.findOne(filter);
          message.save(function (err) {
            if (err) return handleError(err);
            // saved!
          });
        }
      })();
      //this socket is not working
      socket.to(data.roomId).emit('message', {
        from: data.from,
        body: data.body,
        timestamp: data.timestamp
      });
    });
});

前端

//this socket is not receiving anything
    ioClient.on('message', (msg) => {
      console.log(msg); //this is not printing anything
      if (isMount) {
        setMessages((previousMessages) => [
          ...previousMessages,
          toChatMessage(msg)
        ]);
      }
    });

标签: reactjssocketssocket.io

解决方案


当您从给定套接字使用广播到房间时

io.on('connection', function(socket){
  socket.to('some room').emit('some event');
});

除了发送者之外,房间中的每个套接字都会收到该事件。

在您的情况下,您需要使用io.to('some room').emit('some event'); 查看此Socket.IO 文档


推荐阅读