Невозможно подключиться к комнатам с socket.io - PullRequest
0 голосов
/ 03 августа 2020

Я использую 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,
    });
  }
};

на клиенте, слушаю вот так:

Chat. 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 и прослушивать указанную комнату на клиенте?

1 Ответ

0 голосов
/ 04 августа 2020

Удалось найти рабочее решение (сообщения чата передаются только предполагаемым получателям), но не знаю, оптимально оно или эффективно.

добавил socket.join в мой индекс. js файл

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,
    });

И на передней панели, при монтировании, я присоединяюсь к комнате и слушаю новое сообщение с сервера.

  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));
      }
    });
  }, []);
...