2017-01-17 20 views
0

Я пытаюсь решить проблему, связанную с потоком отдыха между API-интерфейсом Nest и службой (ST), которая не поддерживает потоковую передачу.Завершить прослушиватель событий EventSource?

Чтобы обойти это, я создал службу на Sails, которая отправляет запрос от ST, содержащий токен Nest, а затем запускает прослушиватель событий EventSource, который отправляет данные обратно в ST.

Это в значительной степени основано от Nest покоя потокового примера здесь: 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 хочет отключить потоковое потоки событий, как мне получить доступ к их конкретному слушателю событий и остановить его от запуска. Событие «Путь» вызывается каждый раз, когда обновляется обновление Nest API, в котором я пересылаю данные по – K20GH

ответ

1

Каждое подключение к SSH-клиенту является специальным сокетом.

Если конкретный клиент не хочет потокового потока событий, не делайте соединение. Если они запускают потоки событий, но хотят отключить их, позвоните по телефону source.close();source=NULL;

Если с серверной стороны вы хотите прекратить отправку сообщений, закройте сокет. Вы не указали код на стороне сервера, но если он запускает выделенный процесс на SSE-клиент, вы просто выходите из процесса. Если вы поддерживаете список сокетов, по одному на подключенный клиент, закройте сокет. На node.js вы можете запускать функцию на setInterval. Чтобы закрыть соединение, которое вы делаете, и clearInterval() и response.end();.

+0

. Проблема не между моим Node-сервером и API-интерфейсом Nest. Я запускаю прослушиватель событий Node, получая POST-запрос от пользователя. Этот вызов содержит их ST-конечную точку, где данные отправляются на другой вызов POST. Проблема в том, что ST не может использовать Sockets, поэтому он использует HTTP-запросы для отправки данных на него, поэтому я не могу просто просто закрыть соединение пользователя с узлом. Мне нужно, чтобы пользователь мог сделать HTTP-запрос на мой сервер узлов, чтобы отменить приемник Nest – K20GH