admin管理员组文章数量:1389903
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);
本文标签: javascriptNodejs quotEventEmitter memory leak detectedquotStack Overflow
版权声明:本文标题:javascript - Node.js "EventEmitter memory leak detected" - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744619112a2615915.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论