我将尝试在我的NodeJs服务器被访问时实现发送服务器推送事件(SSE)的方法。以下是我实现的方式:
事件的maxListeners错误消失了,但在第一个顺序之后它没有通知我的应用程序。 我找不到绑定事件的方法,在我的 /路由之外,因为我需要通过发送数据。
//...code...
import EventSource from "eventsource";
const EventEmitter = require('events');
const events = new EventEmitter();
// events.setMaxListeners(10);
// api end point route from where the new order requests will be coming
router.route('/new-order')
.post((req, res) => {
const orderData = req.body.data;
//... save order and emit an event to send response to the client react app
events.emit('newOrder', orderData);
});
// define a function to send SSE events to the client
const sse = res => data => {
const dataToSend = JSON.stringify(data);
res.write(`data:${dataToSend}`);
res.write("\n\n");
};
// define an EventSource route for the client to be connected for new events
router.route('/sse')
.get((req, res) => {
res.writeHead(200, {
"Connection": "keep-alive",
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
});
res.write("\n");
const sendSSE = sse(res);
/*
PROBLEMATIC CODE-- EACH request to /sse route adds new event listener,
and in minutes, it exceeds the limit of maxListeners, and I get the warning
to increase the max event listeners limit by using setMaxListeners()
even if only 1 user is using the front end app.
*/
events.on('newOrder', sendSSE);
});
//...Code...
// Client Side
const newOrderReceived = (e) => {
console.log(JSON.parse(e.data));
};
if ( !window.eventSource ) {
window.eventSource = new EventSource('https://example.com/sse');
window.eventSource.onmessage = newOrderReceived;
}
但问题在于,即使只有1个用户使用应用程序,maxListeners也会非常快地耗尽。
如果我将事件绑定代码更改为
events.once('newOrder', sendSSE);
事件的maxListeners错误消失了,但在第一个顺序之后它没有通知我的应用程序。 我找不到绑定事件的方法,在我的 /路由之外,因为我需要通过发送数据。
res.write(`data:${dataToSend}`);
res.write("\n\n");
在我的情况下,res
对象仅在路由中可用,即/sse
。
有什么解决办法或更好的方法可用于在NodeJS中发送服务器推送事件(SSE)以通知我的前端应用程序,在每次请求我的API端点时进行通知吗?
任何帮助都将不胜感激。
附言: 我搜索这个问题时看到的所有教程/指南都在路由内部实现了一个setInterval来发送数据,我没有找到一篇教程解释如何响应服务器上的事件发送数据。
res
对象的方法了吗? - Priyath Gregory