使用Socket.io和Firebase跟踪活跃用户

时间:2017-01-23 18:37:33

标签: javascript node.js express socket.io

我正在尝试跟踪活跃用户的Node / Express应用。

该应用依赖于外部API来发布和接收JWT令牌。这些令牌直接传递给客户端,存储它们并用于后续API请求。这就是说,我没有使用Node"会话"。

我使用socket.io来加入自定义loginlogoutdisconnect事件。当这些事件触发时,我可以更新数据库(firebase)并根据需要添加/删除活动用户。

问题是我的应用在多个服务器之间进行了负载均衡,因此我无法按socket.id键入活动用户,因为它可能会发生变化。我的想法是在user_id之前对活跃用户进行关键,但是,我无法弄清楚如何从disconnect事件中获取用户ID。其他事件由客户端触发,因此我可以将用户ID发送到服务器......

client.js

import io from 'socket.io-client';

const socket = io('/');

socket.emit('login', {user_id: 1234, email: 'example@gmail.com'})

server.js

io.on('connection', (socket) => {
    const activeUsersRef = admin.database().ref('activeUsers');

    socket.on('login', (userData) => {
        activeUsersRef.update({
            [userData.user_id]: userData
        })
    });

    socket.on('logout', (userData) => {
        activeUsersRef.update({
            [userData.user_id]: null
        })
    });

    socket.on('disconnect', () => {

        // How to get user ID?
        activeUsersRef.update({
            [???]: null
        })

    });
});

如果我没有跟踪节点服务器中的用户会话,如何从disconnect事件中访问用户ID?

1 个答案:

答案 0 :(得分:0)

我不确定你的具体情况是什么,但这里有一些对我有用的代码:

io.on('connection', function(socket){

  socket.on('chat message', function(msg){
    io.emit('chat message', msg);
  });

  socket.on('login', (userData) => {
        socket.on('disconnect', function () {
          console.log(userData);
        });
  });
});

显然,您需要更改有关userData如何存储和显示的一些小问题。

希望这有帮助!