【问题标题】:Not able to connect to rooms with socket.io无法使用 socket.io 连接到房间
【发布时间】:2020-11-23 04:07:16
【问题描述】:

我在应用程序的两个地方使用了socket io:

  1. 在每个人都可以看到的主页上发出优惠
  2. 仅基于order_id 在两个用户之间发送聊天消息

我能够设置第一个用例,但不能设置第二个。创建新消息时,点击控制器中的套接字部分后响应状态为 500。

index.js

  const serverIO = server.listen(
    port,
    console.log(`Listening on Port ${port}`)
  );
  const io = require("./socket").init(serverIO);
  io.on("connection", (socket) => {
    socket.join("some room");
    console.log("cient connected");
  });

socket.js

let io;

module.exports = {
  init: (httpServer) => {
    io = require("socket.io")(httpServer);
    return io;
  },
  getIO: (socket) => {
    if (!io) {
      throw new Error("Socket.io not initialized!");
    }
    console.log("socket", socket());
    return io;
  },
};

chatController.js

const io = require("../socket");
const chatModel = require("./chatModel.js");

exports.createChat = async (req, res) => {
  try {
    const savedMessage = await chatModel.saveMessage(req.body);
    if (!savedMessage) {
      return res.status(400).json({
        errorMessage: "Something went wrong with your chat request",
      });
    }
    io.getIO().socket.to(req.body.order_id).emit("newMessage", { action: "create", message: savedMessage });
    return res.status(200).json(savedMessage);
  } catch (error) {
    return res.status(500).json({
      errorMessage: error,
    });
  }
};

在客户端,我是这样听的:

聊天.js

useEffect(() => {
    const socket = openSocket(baseURL);
    socket.on("newMessage", ({ room, data }) => {
      console.log("room", room); //not being reached
      if (data.action === "create") {
        dispatch(addMessage(...data.message));
      }
    });
  }, []);

我尝试从文档中添加样板代码,但这似乎不起作用。

io.on('connection', socket => {
  socket.join('some room');
});

如何根据 orderId 加入房间并在客户端收听所述房间?

【问题讨论】:

    标签: node.js reactjs express sockets knex.js


    【解决方案1】:

    能够找到一个可行的解决方案(聊天消息仅广播给预期的接收者),但不知道它是否是最佳的或有效的。

    在我的 index.js 文件中添加了 socket.join

    io.on("connection", (socket) => {
       socket.on("joinRoom", (room) => {
          console.log("joined room");
          socket.join(room);
        });
    
        console.log("cient connected");
      });
    

    修改了我的控制器

    io.getIO().to(req.body.order_id).emit("newMessage", {
          action: "create",
          message: savedMessage,
        });
    
    

    在前端,在挂载时,我正在加入一个房间并监听来自服务器的 newMessage。

      useEffect(() => {
        const socket = openSocket(baseURL);
        socket.emit("joinRoom", orderId);
        socket.on("newMessage", (data) => {
          console.log("data", data);
          if (data.action === "create") {
            dispatch(addMessage(...data.message));
          }
        });
      }, []);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2018-01-09
      相关资源
      最近更新 更多