NodeJS 作为具有多个连接的 SSE-Client
NodeJS as SSE-Client with multiple connections
我在我的应用程序中使用第三方 IEXCloud API。
我对如何在 NodeJS 中为 SSE 请求创建多个连接感到困惑。
let url = `https://cloud-sse.iexapis.com/stable/stocksUSNoUTP?token=${token}&symbols=aapl,amzn,twtr`
function connect() {
stream = request({
url: url,
headers: {
'Content-Type': 'text/event-stream'
}
})
}
connect();
stream.on('socket', () => {
console.log("Connected");
});
stream.on('end', () => {
console.log("Reconnecting");
connect();
});
stream.on('complete', () => {
console.log("Reconnecting");
connect();
});
stream.on('error', (err) => {
console.log("Error", err);
connect();
});
stream.on('data', (response) => {
var chunk = response.toString();
var cleanedChunk = chunk.replace(/data: /g, '');
if (partialMessage) {
cleanedChunk = partialMessage + cleanedChunk;
partialMessage = "";
}
var chunkArray = cleanedChunk.split('\r\n\r\n');
chunkArray.forEach(function (message) {
if (message) {
try {
var quote = JSON.parse(message)[0];
console.log(quote);
} catch (error) {
partialMessage = message;
}
}
});
});
function wait () {
setTimeout(wait, 1000);
};
wait();
这里可以单连接请求,也可以接收流数据
但我的情况是,如果我有两个如下所示的 URL。
https://cloud-sse.iexapis.com/stable/stocksUSNoUTP?token=${token}&symbols=aapl,amzn,twtr
https://cloud-sse.iexapis.com/stable/stocksUSNoUTP?token=${token}&symbols=isf,avv,nflx
如何通过多个连接分别处理两个 URL?
通过谷歌搜索没有得到足够的想法。
谢谢
首先,您在 connect()
中隐式创建了一个全局变量 stream
。不要这样做,因为它会导致错误。这很重要:当您当前的脚本第二次调用 connect() 时,它将重新制作 stream
,这意味着您分配的所有事件处理程序都将丢失。
因此,在那之后,一种方法是复制粘贴:stream1
和 stream2
作为全局变量,connect1()
和 connect2()
函数, url1
和 url2
.
到那时你就有了一些工作。所以,除非它是一次性脚本,否则下一步将把 Martin Fowler 的重构(第二版,从 2018 年开始,在 JavaScript 中显示示例)下架并开始重构。例如。将数据事件处理程序拉出到一个独立函数中。例如。让 connect()
接受 url
和 return stream
(所有事件处理程序都已附加)。
我在我的应用程序中使用第三方 IEXCloud API。 我对如何在 NodeJS 中为 SSE 请求创建多个连接感到困惑。
let url = `https://cloud-sse.iexapis.com/stable/stocksUSNoUTP?token=${token}&symbols=aapl,amzn,twtr`
function connect() {
stream = request({
url: url,
headers: {
'Content-Type': 'text/event-stream'
}
})
}
connect();
stream.on('socket', () => {
console.log("Connected");
});
stream.on('end', () => {
console.log("Reconnecting");
connect();
});
stream.on('complete', () => {
console.log("Reconnecting");
connect();
});
stream.on('error', (err) => {
console.log("Error", err);
connect();
});
stream.on('data', (response) => {
var chunk = response.toString();
var cleanedChunk = chunk.replace(/data: /g, '');
if (partialMessage) {
cleanedChunk = partialMessage + cleanedChunk;
partialMessage = "";
}
var chunkArray = cleanedChunk.split('\r\n\r\n');
chunkArray.forEach(function (message) {
if (message) {
try {
var quote = JSON.parse(message)[0];
console.log(quote);
} catch (error) {
partialMessage = message;
}
}
});
});
function wait () {
setTimeout(wait, 1000);
};
wait();
这里可以单连接请求,也可以接收流数据
但我的情况是,如果我有两个如下所示的 URL。
https://cloud-sse.iexapis.com/stable/stocksUSNoUTP?token=${token}&symbols=aapl,amzn,twtr
https://cloud-sse.iexapis.com/stable/stocksUSNoUTP?token=${token}&symbols=isf,avv,nflx
如何通过多个连接分别处理两个 URL?
通过谷歌搜索没有得到足够的想法。
谢谢
首先,您在 connect()
中隐式创建了一个全局变量 stream
。不要这样做,因为它会导致错误。这很重要:当您当前的脚本第二次调用 connect() 时,它将重新制作 stream
,这意味着您分配的所有事件处理程序都将丢失。
因此,在那之后,一种方法是复制粘贴:stream1
和 stream2
作为全局变量,connect1()
和 connect2()
函数, url1
和 url2
.
到那时你就有了一些工作。所以,除非它是一次性脚本,否则下一步将把 Martin Fowler 的重构(第二版,从 2018 年开始,在 JavaScript 中显示示例)下架并开始重构。例如。将数据事件处理程序拉出到一个独立函数中。例如。让 connect()
接受 url
和 return stream
(所有事件处理程序都已附加)。