一旦事件完成,我想删除监听器以避免套接字io中出现此问题。
我收到此错误
MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个连接侦听器。使用generator.setMaxListeners()增加限制
我尝试使用removeAllListeners / removeListener / off,但是它们都不起作用。
const io = socket(httpServer);
(async () => {
await io.on('connection', async function (client) {
// Some Code //
await client.emit('message', "Done")
io.removeAllListeners("connection")
})
})
答案 0 :(得分:0)
如果要与单个客户端进行单套接字连接,请使用await io.once
代替await io.on
。否则,它将对服务器端的每个请求生成多个服务器侦听器实例。
答案 1 :(得分:0)
我遇到了同样的问题,我可以使用以下代码解决问题,
mqttClient.off('message', mqttClient.listeners("message")[0])
mqttClient.listeners("message")
:我将返回附加到“消息”事件的侦听器数组。
您也可以使用removeListner()
在这里,我使用了MQTT的情况。您也可以针对socket io
遵循此过程。
答案 2 :(得分:0)
您可以使用 --trace-warnings
跟踪该警告(应该适用于 node
、nodemon
和 babel-node
)。
就我而言,在 Node 中使用 MySQL 时出现此错误:
(node:44) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
at _addListener (events.js:247:17)
at PoolConnection.addListener (events.js:263:10)
at /app/server.js:100:1 // Redacted, but here's the specific line and column for the error
at Ping.onOperationComplete (/app/node_modules/mysql/lib/Pool.js:110:5)
at Ping.<anonymous> (/app/node_modules/mysql/lib/Connection.js:526:10)
at Ping._callback (/app/node_modules/mysql/lib/Connection.js:488:16)
at Ping.Sequence.end (/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
at Ping.Sequence.OkPacket (/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:92:8)
at Protocol._parsePacket (/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
at Parser._parsePacket (/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
这就是问题所在:
const mysql_pool = mysql.createPool(mysql_pool_options);
// ...
io.on('connection',function(socket){
socket.on('foobar', function(foo) {
// Stuff going on ...
// Get connection and query the database
mysql_pool.getConnection(function(err, current_mysql_connection) {
current_mysql_connection.query(my_great_query, function(query_error, results) {
// Some other stuff I do ...
});
// ? Here's the issue, I didn't need to do this here ?
current_mysql_connection.on('error', function(err) {
// console.log(err);
});
});
});
});