2017-01-17 5 views
0

Ich versuche, ein Problem mit Rest-Streaming zwischen der Nest-API und einem Dienst (ST), der kein Streaming unterstützt, zu umgehen.EventSource-Ereignislistener beenden?

Um dies zu umgehen, habe ich einen Dienst auf Sails erstellt, der eine Postanforderung von ST mit dem Nest Token annimmt und dann einen EventSource-Ereignis-Listener auslöst, der die Daten zurück an ST sendet.

Es wird hier aus dem Nest Rest-Streaming-Beispiel basiert stark: https://github.com/nestlabs/rest-streaming und mein Code wie folgt:

startStream: function(req, res) { 
     var nestToken = req.body.nestToken, 
       stToken = req.body.stToken, 
       endpointURL = req.body.endpointURL, 
       source = new EventSource(sails.config.nest.nest_api_url + '?auth=' + nestToken); 


     source.addEventListener('put', function(e) { 
      var d = JSON.parse(e.data); 
      var data = { devices: d.data.devices, structures: d.data.structures}, 
        config = { headers : {'Authorization': 'Bearer ' + stToken}}; 

      sendData(endpointURL, data, config); 
     }); 

     source.addEventListener('open', function(e) { 
      console.log("Connection opened"); 
     }); 

     source.addEventListener('auth_revoked', function(e){ 
      console.log("Auth token revoed"); 
     }); 

     source.addEventListener('error', function(e) { 
     if (e.readyState == EventSource.CLOSED) { 
      console.error('Connection was closed! ', e); 
     } else { 
      console.error('An unknown error occurred: ', e); 
     } 
     }, false); 
    } 
}; 

Das Problem, das ich allerdings vorauszusehen ist, dass, sobald eine Anforderung durch den Knoten-Server empfangen wird, Es startet den Event-Listener, aber ich kann nicht für das Leben von mir herausfinden, wie ich den Event-Listener töten kann.

Wenn ich nicht einen Weg finden kann, dies zu stoppen, dann wird jeder EventListener unbegrenzt laufen, was offensichtlich nicht geeignet ist.

Hat jemand irgendwelche Vorschläge, wie man das Problem überwinden kann?

+0

Um zu überprüfen, habe ich verstanden: Ihr "Put" Event Listener wird nur einmal aufgerufen werden? Und danach brauchst du das Objekt 'EventSource' nicht mehr? –

+0

So habe ich meinen Controller wie oben, der von mehreren tausend Benutzern erreichbar ist. Jeder Benutzer, der diese Funktion aufruft, erstellt einen Ereignis-Listener für seine eindeutige API. Das Problem ist, wie ich jeden dieser Listener verwalten kann. dh Benutzer XYZ möchte das Ereignisstreaming abschalten, wie ich auf seinen spezifischen Ereignis-Listener zugreife und ihn vom Laufen abhalte. Das Put-Ereignis wird jedes Mal aufgerufen, wenn die Nest-API aktualisiert wird. Dort leitet ich die Daten an die Adresse – K20GH

Antwort

1

Jede SSH-Clientverbindung ist ein dedizierter Socket.

Wenn ein bestimmter Client kein Ereignisstreaming benötigt, stellen Sie die Verbindung nicht her. Wenn sie das Ereignisstreaming starten, es jedoch deaktivieren möchten, rufen Sie source.close();source=NULL;

an. Wenn Sie von der Serverseite aus keine weiteren Nachrichten senden möchten, schließen Sie den Socket. Sie haben den serverseitigen Code nicht angezeigt, aber wenn er einen dedizierten Prozess pro SSE-Client ausführt, beenden Sie den Prozess einfach. Wenn Sie eine Liste von Sockets verwalten, eine pro verbundenem Client, schließen Sie den Socket. Auf node.js können Sie eine Funktion auf setInterval ausführen. Um die Verbindung zu schließen, tun Sie und clearInterval() und response.end();.

+0

weiter. Das Problem besteht nicht zwischen meinem Knotenserver und der Nest-API. Ich starte meinen Node-Ereignis-Listener, indem ich einen POST-Anruf vom Benutzer erhalte. Dieser Aufruf enthält ihren ST-Endpunkt, an den die Daten gesendet werden, um einen anderen POST-Aufruf zu verwenden. Das Problem ist, dass ST Sockets nicht verwenden kann, daher ist es abhängig von HTTP-Anforderungen, die Daten an es zu senden, so dass ich nicht einfach den Benutzer schließen kann - Node-Verbindung. Ich brauche eine Möglichkeit, dass der Benutzer eine HTTP-Anfrage an meinen Node-Server stellen kann, um seinen Nest-Listener abzubrechen – K20GH