2017-01-23 4 views
0

Ich habe Node/Express-App, für die ich versuche, aktive Benutzer zu verfolgen.Tracking aktive Benutzer mit Socket.io und Firebase

Die App basiert auf einer externen API zum Ausgeben und Empfangen von JWT-Tokens. Diese Token werden direkt an den Client übergeben, wo sie gespeichert und für nachfolgende API-Anfragen verwendet werden. Das heißt, ich benutze keine Node "Sessions".

Ich verwende socket.io, um eine benutzerdefinierte login, logout und die disconnect Ereignisse einhängen. Wenn diese Ereignisse ausgelöst werden, kann ich die Datenbank (Firebase) aktualisieren und aktive Benutzer nach Bedarf hinzufügen/entfernen.

Das Problem ist, dass meine App Last über mehrere Server verteilt ist, so kann ich die aktiven Benutzer nicht durch socket.id, da es sich ändern kann. Mein Gedanke war, die aktiven Benutzer durch user_id zu markieren, aber, Ich kann nicht herausfinden, wie man die Benutzeridentifikation vom disconnect Ereignis erhält. Die anderen Ereignisse werden vom Client ausgelöst, so kann ich nur die Benutzer-ID an den Server senden ...

Client.js

import io from 'socket.io-client'; 

const socket = io('/'); 

socket.emit('login', {user_id: 1234, email: '[email protected]'}) 

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 
     }) 

    }); 
}); 

Wie kann ich über das Ereignis disconnect auf die Benutzer-ID zugreifen, wenn ich keine Benutzersitzungen in einem Knotenserver protokolliere?

+1

Ich habe eine vorherige Antwort [hier] (http://stackoverflow.com/questions/37591541/how-to-change-status-of-perticular-user-when-socket-is-disconnect/37592164#37592164) gepostet das könnte helfen – Rho

Antwort

0

Ich bin nicht sicher, was Ihre genaue Szenario ist, aber hier ist ein Code, der für mich gearbeitet:

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); 
     }); 
    }); 
}); 

Offensichtlich müssen Sie ein paar kleinere Dinge ändern, wie die userData gespeichert und angezeigt wird.

Hoffe, das hilft!