终止事件源事件侦听器



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

为了解决这个问题,我在 Sails 上构建了一个服务,该服务从 ST 接收包含 Nest 令牌的 post 请求,然后触发一个 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);
    }
};

预见的问题是,一旦节点服务器收到请求,它就会启动事件侦听器,但是我一生都无法弄清楚如何杀死事件侦听器。

如果我找不到阻止这种情况的方法,那么每个事件侦听器都将无限期运行,这显然是不合适的。

有没有人对如何克服这个问题有任何建议?

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

如果特定客户端不需要事件流,请不要建立连接。如果他们启动事件流式传输,但想要将其关闭,请拨打source.close();source=NULL;

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

最新更新