【问题标题】:Terminate EventSource event listener?终止 EventSource 事件侦听器?
【发布时间】:2017-01-17 17:12:48
【问题描述】:

我正在尝试解决与 Nest API 和不支持流式传输的服务 (ST) 之间的休息流式传输有关的问题。

为了解决这个问题,我在 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 都会无限期地运行,这显然是不合适的。

有人对如何解决这个问题有任何建议吗?

【问题讨论】:

  • 检查我的理解:你的“put”事件监听器只会被调用一次?之后你就不再需要EventSource 对象了吗?
  • 所以我有上面的控制器,可以被几千个用户访问。每个调用该函数的用户都会为其独特的 API 创建一个事件侦听器。问题是,我如何管理每个听众。即,用户 XYZ 想要关闭事件流,我如何访问他们的特定事件侦听器并阻止它运行。每次 Nest API 更新时都会调用 Put 事件,这是我转发数据的地方

标签: node.js sails.js eventsource


【解决方案1】:

每个 SSH 客户端连接都是一个专用套接字。

如果特定客户端不想要事件流,请不要建立连接。如果他们启动事件流,但想关闭它,请致电source.close();source=NULL;

如果您想从服务器端停止发送消息,请关闭套接字。 您没有显示服务器端代码,但如果它为每个 SSE 客户端运行一个专用进程,那么您只需退出该进程。如果您要维护一个套接字列表,每个连接的客户端一个,请关闭套接字。在 node.js 上,您可能正在 setInterval 上运行一个函数。要关闭您与clearInterval()response.end(); 的连接。

【讨论】:

  • 问题不在我的 Node 服务器和 Nest API 之间。我通过接收来自用户的 POST 调用来启动我的 Node 事件侦听器。该调用包含他们的 ST 端点,使用另一个 POST 调用将数据发送到该端点。问题是 ST 不能使用 Sockets,所以它依赖 HTTP 请求向它发送数据,所以我不能轻易关闭用户 - 节点连接。我需要一种方法,用户可以向我的节点服务器发出 HTTP 请求以取消他们的 Nest 监听器
猜你喜欢
  • 2012-04-13
  • 2016-07-24
  • 2018-09-04
  • 2015-12-18
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多