Nodejs / express服务器将一个socket.id用于2个RN客户端进行消息保存

时间:2019-06-14 06:03:44

标签: node.js socket.io

nodejs(10.16)和express(4.16)后端服务器(服务器)与用于聊天应用程序的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);
    };

从控制台输出中,连接到同一房间并聊天的2个客户端的socket.id相同。这是在端口8081上运行的Android模拟器的输出:

socket in new message :  b0po9l6hGZUi9xVDAAAE
msg before broadcast :  8081

这是另一个在端口9090上运行的android模拟器:

socket in new message :  b0po9l6hGZUi9xVDAAAE
msg before broadcast :  9090

但是,客户端的socket.id并不相同。是什么导致服务器对2个客户端使用相同的socket.id?

1 个答案:

答案 0 :(得分:1)

您要尝试的是访问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"})