Javascript Node.js";“检测到EventEmitter内存泄漏”;

Javascript Node.js";“检测到EventEmitter内存泄漏”;,javascript,node.js,Javascript,Node.js,我的bare bone Node.js应用程序看起来是这样的(本质上我每隔一段时间调用一个web服务,并将数据推送到客户端),大约一天后,即使在添加emitter.setMaxListeners(0)之后,我也会遇到下面的运行错误。我很确定我的代码没有内存泄漏。有什么建议吗 /* * Server setup */ var querystring = require('querystring'); var xml2js = require('xml2js'); var parser = new

我的bare bone Node.js应用程序看起来是这样的(本质上我每隔一段时间调用一个web服务,并将数据推送到客户端),大约一天后,即使在添加emitter.setMaxListeners(0)之后,我也会遇到下面的运行错误。我很确定我的代码没有内存泄漏。有什么建议吗

/*
* Server setup
*/
var querystring = require('querystring');
var xml2js = require('xml2js');
var parser = new xml2js.Parser();
var eyes = require('eyes');
var http = require('http');
var app = http.createServer(handler);
var io  = require('socket.io').listen(app);
var emitter = new (require('events').EventEmitter);
emitter.setMaxListeners(0);
io.set('log level', 0);

app.listen(8080);


function handler(req, res){
    res.writeHead(200, {'Content-Type':'text/html'});
    res.end('Test');
}

/*
* Global data object
*/
var xmlData= '';
var cache = [];

/*
* web service info
*/
var postData = querystring.stringify({  
    'index' : '',
    'type' : '-1',
}); 


var options = {
    host: 'localhost',
    path: '/WebService.asmx',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',  
        'Content-Length': postData.length 
    }
};



var getData = function(){

    // Web Service Request Obj
    var webServiceReq = http.request(options, function(res) {  

      res.setEncoding('utf8');  

      res.on('data', function (chunk) {  
        xmlData += chunk;
      }).on('end', function() {

        parser.parseString(xmlData, function(err, data){
                cache = JSON.parse(data['#']);
        });

        io.sockets.emit('message', { "data": cache});

      });// end res.on('end')

    });  


    webServiceReq.write(postData);
    webServiceReq.end();
}

// grab the info every 10 seconds
setInterval(getData, 5000);

// emit the latest data when client initially connects
io.sockets.on('connection', function (socket) {
    // emit the data
    socket.emit('message', {"data": cache});
});
错误:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at Parser.EventEmitter.addListener (events.js:168:15)
    at Parser.exports.Parser.Parser.parseString (C:\WebApplications\WebApp\scripts\node_modules\xml2js\lib\xml2js.js:197:14)
    at Parser.__bind [as parseString] (C:\WebApplications\WebApp\scripts\node_modules\xml2js\lib\xml2js.js:6:61)
    at IncomingMessage.getData (C:\WebApplications\WebApp\scripts\nodeService.js:87:20)
    at IncomingMessage.EventEmitter.emit (events.js:115:20)
    at IncomingMessage._emitEnd (http.js:366:10)
    at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:149:23)
    at Socket.socketOnData [as ondata] (http.js:1356:20)
    at TCP.onread (net.js:410:27)
问题是

Use emitter.setMaxListeners() to increase limit.
这并不意味着“创建发射器对象并将emitter.setMaxListeners(0)添加到代码中”。“发射器”一词在这里指的是从EventEmitter继承的任何对象,例如服务器、进程、请求等。在您的情况下,代码中有两个发射器:应用程序和io。你应该写的是:

var http = require('http');
var app = http.createServer(handler);
var io  = require('socket.io').listen(app);
app.setMaxListeners(0);
io.setMaxListeners(0);
io.set('log level', 0);

app.listen(8080);

谢谢你的帮助!这确实有帮助…但是,在运行了几个小时后,我得到了错误:“致命错误:调用和重试\u 2分配失败-进程内存不足”。这是否意味着我的应用程序确实存在内存泄漏?我已经跟踪了它,我100%确定没有内存泄漏。或者这与setTimeout()函数有关吗?@victorswx如果我错了,请纠正我,但看起来您从未清理过全局对象xmlData,您只需向其追加:xmlData+=chunk;NodeJS进程可以分配一些有限大小的内存,您可以稍微增加一些。但是,在您的情况下,您应该以某种方式更改使用xmlData的逻辑。