【发布时间】:2018-10-03 05:54:59
【问题描述】:
我正在使用 node.js 记录 GPS 设备,但我的行为很奇怪。
我的服务器代码很简单
var net = require('net');
var server = net.createServer(function(socket) {
var imei;
console.log("Socket: " + socket.remoteAddress + ":" + socket.remotePort);
socket.on("data", function(data){
var txt = data.toString("utf-8");
console.log(txt);
if(!imei){
imei = parseInt(txt.split("imei:")[1]);
}
// login device
if(txt.startsWith("##") && txt.endsWith(",A;")){
socket.write('LOAD');
// heartbeat
}else if(parseInt(txt) == imei){
socket.write(`ON`);
}
socket.pipe(socket);
});
socket.on("end", function () {
console.log("out!")
});
});
server.listen(8888);
登录GPS设备后,每隔一分钟发送一次心跳,我只使用一台设备,所以只有一个客户端。
服务器输出如下所示:
Socket: ::ffff:191.000.000.000:9292 // new client
##,imei:000000000000000,A; // login
000000000000000; // heartbeat
000000000000000;
000000000000000;
000000000000000;
000000000000000;
000000000000000;
000000000000000;
000000000000000;
(node:12684) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit
如您所见,在一些消息之后它显示MaxListenersExceededWarning,但我很困惑,如果只有一个客户端连接,为什么我会看到此消息?
代码有问题吗?
我该如何解决这个问题?
编辑:
添加--trace-warnings 标志后
我看到了这个输出:
(node:8592) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit
at _addListener (events.js:280:19)
at Socket.addListener (events.js:297:10)
at Socket.Readable.on (_stream_readable.js:772:35)
at Socket.once (events.js:341:8)
at Socket.Readable.pipe (_stream_readable.js:580:9)
at Socket.<anonymous> (server.js:30:16)
at emitOne (events.js:121:20)
at Socket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
服务器代码第30行为:socket.pipe(socket);
【问题讨论】:
-
可以在运行时添加输出
node --trace-warnings [nameOfYourFile].js -
添加
--trace-warnings显示相同的输出:(node:7120) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit -
好的,我在最后添加了
--trace-warnings,这就是它不起作用的原因。我已经用新信息编辑了帖子 -
我会在服务器代码中尝试
require('events').EventEmitter.prototype._maxListeners = 15;之类的东西 -
我解决了它从代码中删除
pipe。感谢您的宝贵时间!