2017-01-17 1 views
0

Nest APIとストリーミングをサポートしていないサービス(ST)の間のストリーミングの休止に関する問題を回避しようとしています。EventSourceイベントリスナーを終了しますか?

これを回避するために、ネストトークンを含むSTからポストリクエストを受け取り、データをSTに返すEventSourceイベントリスナをトリガするサービスをSailsに構築しました。それは重く、ここで巣の残りのストリーミング例オフに基づいている

次のように https://github.com/nestlabs/rest-streamingと私のコードは次のとおりです。

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

私も予見問題は、一度リクエストがノード・サーバによって受信されたということです、それはイベントリスナーを開始しますが、私が私の人生のために私がイベントリスナーをどのように殺すことができるのか理解できません。

これを停止する方法がわからない場合は、すべてのEventListenerが無期限に実行されますが、これは明らかに適切ではありません。

誰も問題を解決する方法についての提案はありますか?

+0

私が理解したことを確認するには、あなたの「put」イベントリスナーは一度だけ呼び出されますか?その後、 'EventSource'オブジェクトは必要ありません。 –

+0

私は上記のように数千人のユーザーがアクセスできるコントローラを持っています。その関数を呼び出す各ユーザーは、独自のAPI用のイベントリスナーを作成します。問題は、これらのリスナーをどのように管理するかです。つまり、ユーザーXYZがイベントストリーミングをオフにしたい場合、特定のイベントリスナーにアクセスして実行を停止するにはどうすればよいですか。 Putイベントは、Nest APIが更新されるたびに呼び出されます。これは、データの転送先です。 – K20GH

答えて

1

各SSHクライアント接続は専用ソケットです。

特定のクライアントがイベントストリーミングを望まない場合は、接続しないでください。イベントストリーミングを開始してもそれをオフにしたい場合は、source.close();source=NULL;

メッセージの送信を停止する場合は、ソケットを閉じます。 サーバー側のコードは表示されませんでしたが、SSEクライアントごとに専用のプロセスを実行している場合は、プロセスを終了するだけです。接続されているクライアントごとに1つずつ、ソケットのリストを保持している場合は、ソケットを閉じます。 node.jsでは、setIntervalで関数を実行している可能性があります。接続を閉じるにはclearInterval()response.end();です。

+0

ノードサーバーとNest APIの間に問題がありません。ユーザーからのPOST呼び出しを受信して​​ノードイベントリスナーを開始しています。そのコールには、別のPOSTコールを使用してデータが送信されるSTエンドポイントが含まれています。問題は、STがソケットを使うことができないということです。そのため、STはHTTPリクエストを使ってデータを送信します。したがって、ノード接続を簡単に閉じることはできません。ユーザーが自分のノードサーバーにネストリスナーをキャンセルするようにHTTPリクエストを行う方法が必要です – K20GH

関連する問題