一尘不染

MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个消息列表。使用generator.setMaxListeners()增加限制

node.js

我知道这可能标记为重复的解决方案,但是堆栈溢出的解决方案对我来说不起作用。

问题:

(node:5716) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message lis
teners added. Use emitter.setMaxListeners() to increase limit.

我的代码库很大,有时我会遇到此错误,我不知道为什么会发生

我试过了

试图增加听众的限制,但不幸的是它没有用。

const EventEmitter = require('events');
const emitter = new EventEmitter()
emitter.setMaxListeners(50)

更新:

经过一番浏览后,我运行此命令来跟踪wanrning

node --trace-warnings index.babel.js

原来是我的socket.io代码是我正在使用带redis的socket.io的问题

这是错误

node:14212) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message li
steners added. Use emitter.setMaxListeners() to increase limit
    at _addListener (events.js:281:19)
    at RedisClient.addListener (events.js:298:10)
    at Namespace.<anonymous> (D:/newProject/services/socket.js:21:17)
    at emitOne (events.js:115:13)
    at Namespace.emit (events.js:210:7)
    at Namespace.emit (D:\newProject\node_modules\socket.io\lib\namespace.js:213:10)
    at D:\newProject\node_modules\socket.io\lib\namespace.js:181:14
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)

这是代码(但是此代码用于更具体的任务,它不会一直执行)

const redis = require('redis');
const config = require('../config')
const sub = redis.createClient(config.REDIS.port, config.REDIS.host);
const pub = redis.createClient(config.REDIS.port, config.REDIS.host);

sub.subscribe('spread');


module.exports = io => {
    io.on('connection',(socket) => {

        let passport  = socket.handshake.session.passport;  /* To find the User Login  */
        if(typeof passport !== "undefined") {


            socket.on('typing:send',(data) => {

                pub.publish('spread',JSON.stringify(data))
            });
            sub.on('message',(ch,msg) => { // this is the Exact line where I am getting this error


                io.emit(`${JSON.parse(msg).commonID}:receive`,{...JSON.parse(msg)})
            })


        }
    });
};

阅读 3397

收藏
2020-07-07

共1个答案

一尘不染

事件发射器的默认限制为10。您可以使用generator.setMaxListeners增加它。我的建议是不要更改它,除非并且直到明确要求为止,因为您没有取消订阅,所以增加了侦听器。现在到您的代码。

const redis = require('redis');

const config = require('../config')

const sub = redis.createClient(config.REDIS.port, config.REDIS.host);

const pub = redis.createClient(config.REDIS.port, config.REDIS.host);



sub.subscribe('spread');





module.exports = io => {

    io.on('connection',(socket) => {

    //COMMENT : This callback will be executed for all the socket connections.

        let passport  = socket.handshake.session.passport;  /* To find the User Login  */

        if(typeof passport !== "undefined") {





            socket.on('typing:send',(data) => {



                pub.publish('spread',JSON.stringify(data))

            });

            // COMMENT : This is where you are subscribing for each and every socket conected to your server

            sub.on('message',(ch,msg) => { // this is the Exact line where I am getting this error





//COMMENT : Where as you are emiting message on socket manager not on socket.

io.emit(`${JSON.parse(msg).commonID}:receive`,{...JSON.parse(msg)})

            })





        }

    });

};

现在,如果我们分析以上代码,则如果您打开与服务器的20个套接字连接,它将订阅20次,这是错误的。现在,如果您的要求是在服务器级别上侦听在redis上发布的消息,然后在io上发出,则您的代码应如下所示

const redis = require('redis');

const config = require('../config')

const sub = redis.createClient(config.REDIS.port, config.REDIS.host);

const pub = redis.createClient(config.REDIS.port, config.REDIS.host);



sub.subscribe('spread');





module.exports = io => {

sub.on('message',(ch,msg) => { // this is the Exact line where I am getting this error





                io.emit(`${JSON.parse(msg).commonID}:receive`,{...JSON.parse(msg)});

        });

    io.on('connection',(socket) => {



        let passport  = socket.handshake.session.passport;  /* To find the User Login  */

        if(typeof passport !== "undefined") {





            socket.on('typing:send',(data) => {



                pub.publish('spread',JSON.stringify(data))

            });







        }

    });

};
2020-07-07