首页 > 解决方案 > 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?

标签: node.jssocket.io

解决方案


您要做的是访问存储在 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"})

推荐阅读