Javascript SSE发射器多次激发,有时浏览器无法获取事件

Javascript SSE发射器多次激发,有时浏览器无法获取事件,javascript,node.js,express,events,Javascript,Node.js,Express,Events,我在node.js/express应用程序中设置了一个事件发射器。它发出的事件由前端侦听器捕获。问题是,尽管我可以看到emit被调用一次,但发射器最多会发射4次相同的事件。此外,虽然一般情况下,事件是由听者接收并执行的,但有时什么也不会发生。有人知道我做错了什么吗 后端: app.get('/getStatus', isLoggedIn, function(req, res){ res.writeHead(200, {'Content-Type': 'text/event-stream'});

我在node.js/express应用程序中设置了一个事件发射器。它发出的事件由前端侦听器捕获。问题是,尽管我可以看到emit被调用一次,但发射器最多会发射4次相同的事件。此外,虽然一般情况下,事件是由听者接收并执行的,但有时什么也不会发生。有人知道我做错了什么吗

后端:

app.get('/getStatus', isLoggedIn, function(req, res){
res.writeHead(200, {'Content-Type': 'text/event-stream'});
progressEmitter.on('status',function(newState, job_id, fTime, jobLink){
     console.log('Updated state to : ' + newState + ' for job ' + job_id );
     res.write("event: state\n");
     res.write(`data:${newState},${job_id},${fTime},${jobLink}\n\n`);
     console.log(`Emitted state change data! :${newState},${job_id},${fTime},${jobLink}\n\n`);
});
}))

前端:

$(document).ready(function () {
var state = [];
var source = new EventSource('getStatus');
source.addEventListener('state', function(e) {
    state = e.data.split(',');
    for (var ajob in jobsReceived){
        if (jobsReceived[ajob].id == state[1]) {
            jobsReceived[ajob].status = state[0];
            jobsReceived[ajob].finished_time = state[2];
            console.log(state[0]);
            if (state[0] === 'saved') jobsReceived[ajob].link = state[3]; 
            break;
        }
    }
    $('#table').bootstrapTable('updateByUniqueId', {
            id: state[1],
            row: {
                status: format_status(state[0]),
                finished_time: state[2],
                link: state[0] === 'saved'? state[3]:'' 
            }
        });

});

在其他问题上花费了时间之后,我决定以清醒的头脑重新审视它,并最终找到了解决方案。我把它贴在这里,以防有人有同样的问题

这里发生的事情是,每次调用progressEmitter.on()时都会添加一个侦听器。发出事件时,所有侦听器都将运行

为了解决这个问题,请求关闭时必须删除侦听器。这是通过调用emitter.removeListener()完成的。由于此函数需要的参数是事件名和侦听器函数,因此命名侦听器函数更容易。因此,后端代码更改如下:

app.get('/getStatus', isLoggedIn, function(req, res){
   res.writeHead(200, {'Content-Type': 'text/event-stream'});
   function statusEvent(newState, job_id, fTime, jobLink){
     console.log('Updated state to : ' + newState + ' for job ' + job_id );
     res.write("event: state\n");
     res.write(`data:${newState},${job_id},${fTime},${jobLink}\n\n`);
     console.log(`Emitted state change data!'); 
}

   progressEmitter.on('status',statusEvent);
   req.on('close', function(){
     progressEmitter.removeListener('event', statusEvent);
   })
})