如何正确删除节点js eventemitter中的事件监听器

我有一个GET和POST路由的设置,这个想法是发送到路由触发一个事件,GET路由是一个服务器发送的事件stream,触发每次POSTed事件触发…但是,我认为我做了错误的事情,事件监听器似乎得到例行的添加,尽pipe只有一个事件stream用户…我做错了什么?

var events = require('events'), EventEmitter = events.EventEmitter, rr = new EventEmitter(); app.post('/api/:boardname/remoterefresh', function(req, res){ var boardname = req.param('boardname'), data = new Date().getTime(); rr.emit("refresh-"+boardname, data) res.json({data: data}) }); app.get('/api/:boardname/remoterefresh', function(req, res){ var boardname = req.param('boardname') rr.on("refresh-"+boardname, function(data){ setTimeout(function(){ res.write('data: '+data+'\n\n'); }, 1000) }); req.socket.setTimeout(Infinity); res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); res.write('\n'); req.on('close', function(){ console.log('closed') rr.removeListener("refresh-"+boardname, function(){ // }) }) }) 

您应该将您附加的function命名为事件处理程序。 然后删除它,你只需按名称传递函数:

 app.get('/api/:boardname/remoterefresh', function(req, res){ var boardname = req.param('boardname') function refreshHandler(data){ setTimeout(function(){ res.write('data: '+data+'\n\n'); }, 1000) } rr.on("refresh-"+boardname, refreshHandler); req.socket.setTimeout(Infinity); res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); res.write('\n'); req.on('close', function(){ console.log('closed') rr.removeListener("refresh-"+boardname, refreshHandler); }); }); 

基本上removeListener将通过引用来查找给定的函数,如果它发现该函数将它从事件处理程序中移除。