我正在尝试解决Nest API与不支持流式传输的服务(ST)之间的休息流问题。
为了解决这个问题,我在Sails上构建了一个服务,它接收来自包含Nest Token的ST的发布请求,然后触发一个EventSource事件监听器,将数据发送回ST。
它主要基于Nest rest-streaming示例: 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 :(得分:1)
每个SSH客户端连接都是专用套接字。
如果特定客户端不想要事件流,请不要建立连接。如果他们开始播放事件,但想要将其关闭,请致电source.close();source=NULL;
如果从服务器端想要停止发送消息,请关闭套接字。
您没有显示服务器端代码,但如果它为每个SSE客户端运行专用进程,那么您只需退出该进程。如果要维护一个套接字列表,每个连接的客户端一个,请关闭套接字。在node.js上,您可能正在setInterval上运行一个函数。要关闭与clearInterval()
和response.end();
。