无法连接到 socket.io 的房间
Not able to connect to rooms with socket.io
我在应用程序的两个地方使用套接字 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加入房间并在客户端收听房间?
能够找到可行的解决方案(聊天消息仅广播给预期的收件人)但不知道它是否最佳或有效。
在我的 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));
}
});
}, []);
我在应用程序的两个地方使用套接字 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加入房间并在客户端收听房间?
能够找到可行的解决方案(聊天消息仅广播给预期的收件人)但不知道它是否最佳或有效。
在我的 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));
}
});
}, []);