Я использую socket io в двух местах приложения:
- отправка предложений на главной странице, которую может видеть каждый
- отправка сообщений чата только между двумя пользователями на основе
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 и прослушивать указанную комнату на клиенте?