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
1 Answer
Reset to default 6The 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);