node.js - Nodejs/express 服务器在消息保存中为 2 个 RN 客户端使用一个 socket.id
问题描述
nodejs (10.16) 和 express (4.16) 后端服务器 (server) 使用 socket.io 2.2.0 运行聊天应用程序。服务器接收到的消息将被广播给连接到同一个房间(频道)的客户端。socket.io 实例是在 index.js 中创建的:
const io = require('socket.io')(server);
io.on('connection', async (socket) => {
socket.my_id = "";
console.log("socket.id : ", socket.id);
app.set("socket", socket);
console.log("Socketio server is initialized");
//disconnect
socket.on('disconnect', async function() {
//if (socket.my_id) helper.RemoveSocketUser(user.fort_token, socket.my_id);
console.log('disconnected event');
});
});
server.listen(port, () => {};
然后在服务器上保存消息后,使用套接字向同一个房间的客户端广播。
try {
await msg.save();
msg.user_name = req.user.name;
msg.user_avatar = req.user.user_data.avatar;
const io = req.app.get("io");
const socket = req.app.get('socket');
const room = msg.event_id.toString();
socket.my_id = req.user.id;
socket.join(room);
console.log("socket in new message : ", socket.id);
console.log("msg before broadcast : ", msg.data.msg_body);
io.to(room).emit("event message", msg);
return res.status(200).send(req.body.data.msg_body);
} catch (err) {
console.log("Error in saving/braodcasting a new message", err);
return res.status(400).send(err.message);
};
从控制台输出来看,socket.id 对于连接到同一个房间并聊天的 2 个客户端是相同的。这是在端口 8081 上运行的 Android 模拟器的输出:
socket in new message : b0po9l6hGZUi9xVDAAAE
msg before broadcast : 8081
这是另一个在 9090 端口上运行的安卓模拟器:
socket in new message : b0po9l6hGZUi9xVDAAAE
msg before broadcast : 9090
但是客户端的 socket.id 是不一样的。是什么导致服务器对 2 个客户端使用相同的 socket.id?
解决方案
您要做的是访问存储在 express 中的套接字对象,每次连接新套接字时都会更新套接字对象,这就是为什么您获得相同的套接字 ID [上次连接]。
要从 io 连接范围之外访问特定套接字,您必须从io
对象获取套接字实例。
您需要将套接字 ID 存储在数据库或内存(如 redis)中的某个位置。
const socketid = `get user's latest connected socket id.`
cont socket = io.sockets.sockets[socketid];
socket.emit('req', { data: "something"})
推荐阅读
- android - Android Instant App:即时应用程序中不允许“文本转语音”吗?
- php - Laravel 控制器中的 Python 脚本执行错误
- c# - .Net Core 队列后台任务
- python - 尝试升级 python 包时出错
- laravel - facebook登录没有正确重定向回来
- rdf - A subclassOf B、A subclassOf C 和 A subclass of intrsection B 和 C 的区别
- ros - URDF机器人的轮子在“滚动”时重置转向角
- jenkins - 如何从詹金斯运行 jmeter
- angular - Angular 无法获取视图中的属性内容
- ruby-on-rails - 图片水印 MiniMagick & Rails 5.2