Node.js "EventEmitter Speicher-Leck erkannt"
meinen nackten Knochen Node.js app sieht wie folgt aus (im wesentlichen ich einen Webdienst aufrufen, jeder so oft, und schieben Sie die Daten an die clients) Nach einem Tag oder so, bekomme ich den Fehler unter laufen, sogar nach dem hinzufügen emitter.setMaxListeners(0). Ich bin mir ziemlich sicher, dass mein code keine Speicherverluste. Irgendwelche Ratschläge?
/*
* 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});
});
Den Fehler:
(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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass
bedeutet nicht 'erstellen emitter-Objekt, und fügen Sie den emitter.setMaxListeners(0), um Ihren code". Wort "emitter" bezieht sich hier auf JEDES Objekt erbt von EventEmitter, z.B. server -, Prozess -, Anfrage, etc.. In Ihrem Fall haben Sie 2 Strahler im code gezeigt: app und io. Sie schreiben sollte ist:
Wenn Sie möchten erhöhen die Grenze die sich Global positionieren Sie die Linie am Anfang Ihrer app:
require('events').EventEmitter.prototype._maxListeners = 100;