当我想从不同的微服务使用 SSE 时,我遇到了同样的问题,我采用了这种方法,它对我有用。
node.js 文件
const eventSource = require('eventsource');
async socEventStream(req, res) {
// list of the event you want to consume
const list = ['EVENT1_NAME', 'EVENT2_NAME','EVENT3_NAME'];
try {
const e = new eventSource('url//of_sse_event', {});
for (const l of list) {
e.addEventListener(l, (e) => {
const data = e.data;
// Your data
console.log('event data =====>',data)
});
};
res.on('close', () => {
for (const l of list) {
e.removeEventListener(l, (e) => {
});
}
})
} catch (err) {
console.log(err)
}
}
如果你想在 node.js 上消费事件并将其发送给客户端,那么
const eventSource = require('eventsource');
async socEventStream(req, res) {
// setting express timeout for more 24 hrs
req.setTimeout(24 * 60 * 60 * 1000);
// setting headers for client to send consumed sse to client
const headers = {
'Content-Type': 'text/event-stream',
'Connection': 'keep-alive',
'Cache-Control': 'no-cache',
'Access-Control-Allow-Headers': 'Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With,observe,x-access-key',
'Access-Control-Allow-Methods': 'POST, PUT, GET, OPTIONS, DELETE',
'Access-Control-Allow-Origin': '*',
};
res.setTimeout(24 * 60 * 60 * 1000);
res.writeHead(200, headers);
// list of the event you want to consume
const list = ['EVENT1_NAME', 'EVENT2_NAME','EVENT3_NAME'];
try {
const e = new eventSource('url//of_sse_event', {});
for (const l of list) {
e.addEventListener(l, (e) => {
const data = e.data;
// Your data
res.write(`event:${l}\ndata:${data}\n\n`);
});
};
req.on('close', () => {
for (const l of list) {
e.removeEventListener(l, (e) => {
});
}
})
} catch (err) {
console.log(err)
}
}