最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Node.js "EventEmitter memory leak detected" - Stack Overflow

programmeradmin2浏览0评论

my bare bone Node.js app looks like this (essentially I call a web service every so often, and push that data out to clients) After a day or so, I get the error below of running, even after adding emitter.setMaxListeners(0). I'm pretty sure my code does not have any memory leaks. Any advice?

/*
* 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});
});

The error:

(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 IningMessage.getData (C:\WebApplications\WebApp\scripts\nodeService.js:87:20)
    at IningMessage.EventEmitter.emit (events.js:115:20)
    at IningMessage._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)

my bare bone Node.js app looks like this (essentially I call a web service every so often, and push that data out to clients) After a day or so, I get the error below of running, even after adding emitter.setMaxListeners(0). I'm pretty sure my code does not have any memory leaks. Any advice?

/*
* 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});
});

The error:

(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 IningMessage.getData (C:\WebApplications\WebApp\scripts\nodeService.js:87:20)
    at IningMessage.EventEmitter.emit (events.js:115:20)
    at IningMessage._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)
Share Improve this question edited Aug 27, 2012 at 21:18 victormejia asked Aug 27, 2012 at 17:33 victormejiavictormejia 1,1843 gold badges12 silver badges31 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 6

The problem is that

Use emitter.setMaxListeners() to increase limit.

doesn't mean 'create emitter object and add emitter.setMaxListeners(0) to your code'. Word 'emitter' refers here to ANY object that inherits from EventEmitter, e.g. server, process, request etc. In your case you have 2 emitters in the code shown: app and io. That you should write is:

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);
发布评论

评论列表(0)

  1. 暂无评论