node.js - 带有房间的 Socket IO 私人消息不起作用
问题描述
我正在做一个 Tinder Web 应用程序,我想实现实时聊天。我将 ReactJS 用于客户端,将 Nodejs 用于服务器,我为聊天应用程序添加了 Socket.IO。
当 2 个配置文件相互匹配时,他们可以一起交谈,所以当他们匹配时,我为他们创建一个房间,并使用从他们的 user_id 创建的唯一 ID。所以让我们想象一下:
user_id 90 与 user_id 50 匹配 generateRoomid(90, 50) 创建。
服务器端有 3 个事件,connection 事件,create_room 事件,chat-message 事件。
io.on("connection", (socket) => {
socket.on("user_connected", (user_id) => {
/* when they log in I store socket.id but it change every time so I will delete it */
addUser({socket_id: socket.id, user_id: user_id})
})
socket.on("create_room", (data, cookie) => {
let decode = jwt.verify(cookie, process.env.JWT_SECRET)
let user_id = decode.id
let total_match_id = data.map(a => a.id);
/* when user log I catch all match he has and create room for each match */
total_match_id.forEach((id) => {
let room_id = GenerateRoom(user_id, id)
socket.join(room_id)
})
})
socket.on("chat-message", ({ message, user_send, user_receive }) => {
var fullDate = getFullDate();
let room_id = GenerateRoom(user_send, user_receive)
io.to(room_id).emit("chat-message", { user_send, user_receive, message, fullDate })
insertMessage(user_send, user_receive, message, fullDate)
})
});
客户端我做了两件事,一个发送/发送消息的表单,以及一个等待响应显示它的缺陷:
/* useEffect */
const socketMessage = async () => {
socket.on("chat-message", (data) => {
setAllMessage(allMessage => [...allMessage, data.message ]);
});
socketMessage(
//
/* onSubmit */
const sendMessage = (e) => {
e.preventDefault();
const user_send = user.id
const user_receive = userChat.id
if (message !== "" && message != null) {
socket.emit("chat-message", { user_send, message, user_receive });
setMessage("");
}
}
在我想使用socket.id之前,但事情是每个页面的socket.id都发生了变化,我知道这很正常但我无法存储它,所以在阅读了Socket.io doc之后,房间对我来说是最好的选择,我遵循文档,但它不起作用,当我向所有客户端(io.emit)发出时它起作用,但是当我尝试在房间上发出时它不起作用。
任何想法?我做错了什么?
解决方案
推荐阅读
- zsh - 如何发送时间信息以在 zsh-theme 中运行?
- laravel - 为什么 Laravel 的actingAs 没有按预期工作?
- ios - 使用 viewDidAppear() 在 swift5 中关闭另一个 ViewController 后刷新 ViewController
- android - 在 ViewModel 中添加用例时未解析的引用 DaggerApplicationComponent
- python - 如何在 3d 中获得边界(一组点)的平均曲线(一组点)?
- css - 总是在最后一个位置订购弹性项目
- spring - 为什么spring会覆盖标头中的Content-Type?
- python - 如何只替换之后有一些字符的 \n
- sql - 使用 PIVOT 将行转换为列
- javascript - 如何在单独的页面中呈现反应组件?