обнаружена утечка памяти EventEmitter

Я получаю следующее предупреждение:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. Trace: at EventEmitter. (events.js:139:15) at EventEmitter. (node.js:385:29) at Server. (server.js:20:17) at Server.emit (events.js:70:17) at HTTPParser.onIncoming (http.js:1514:12) at HTTPParser.onHeadersComplete (http.js:102:31) at Socket.ondata (http.js:1410:22) at TCP.onread (net.js:354:27) 

Я написал код, подобный этому в server.js:

 http.createServer( function (req, res) { ... }).listen(3013); 

Как это исправить?

    Это объясняется в руководстве: http://nodejs.org/docs/latest/api/events.html#events_emitter_setmaxlisteners_n

    Какая версия узла это? Какой еще код у вас есть? Это не нормальное поведение.

    Короче говоря, его: process.setMaxListeners(0);

    Также см .: node.js – request – Как «emitter.setMaxListeners ()»?

    Я хотел бы отметить здесь, что это предупреждение существует по какой-то причине, и есть хороший шанс, что правильное исправление не увеличивает лимит, но выясняет, почему вы добавляете столько слушателей к одному и тому же событию. Только увеличьте предел, если вы знаете, почему так много слушателей добавляются и уверены, что это то, что вы действительно хотите.

    Я нашел эту страницу, потому что получил это предупреждение, и в моем случае была ошибка в некотором коде, который я использовал, который превращал глобальный объект в EventEmitter! Я бы посоветовал не увеличивать лимит во всем мире, потому что вы не хотите, чтобы эти вещи оставались незамеченными.

    По умолчанию для любого события может быть зарегистрировано не более 10 слушателей.

    Если это ваш код, вы можете указать maxListeners через:

     const emitter = new EventEmitter() emitter.setMaxListeners(100) // or 0 to turn off the limit emitter.setMaxListeners(0) 

    Но если это не ваш код, вы можете использовать трюк, чтобы увеличить лимит по умолчанию во всем мире:

     require('events').EventEmitter.prototype._maxListeners = 100; 

    Конечно, вы можете отключить ограничения, но будьте осторожны:

     // turn off limits by default (BE CAREFUL) require('events').EventEmitter.prototype._maxListeners = 0; 

    КСТАТИ. Код должен быть в самом начале приложения.

    ADD: Поскольку узел 0.11 этот код также работает, чтобы изменить предел по умолчанию:

     require('events').EventEmitter.defaultMaxListeners = 0 

    Принятый ответ дает семантику о том, как увеличить лимит, но поскольку @voltrevo указал, что предупреждение существует по какой-то причине, и ваш код, вероятно, имеет ошибку.

    Рассмотрим следующий код ошибки:

     //Assume Logger is a module that emits errors var Logger = require('./Logger.js'); for (var i = 0; i < 11; i++) { //BUG: This will cause the warning //As the event listener is added in a loop Logger.on('error', function (err) { console.log('error writing log: ' + err) }); Logger.writeLog('Hello'); } 

    Теперь обратите внимание на правильный способ добавления слушателя:

     //Good: event listener is not in a loop Logger.on('error', function (err) { console.log('error writing log: ' + err) }); for (var i = 0; i < 11; i++) { Logger.writeLog('Hello'); } 

    Поиск похожих вопросов в коде перед изменением maxListeners (что объясняется в других ответах)

    замените .on () на один раз (). using once () удаляет прослушиватели событий, когда событие обрабатывается одной и той же функцией. источник: http://nodeguide.com/beginner.html#using-eventemitters

    если это не исправить, то переустановите restler с этим в вашем пакете.json «restler»: «git: //github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d”

    это связано с перестановкой 0.10 с ошибкой с узлом. вы можете увидеть, что проблема закрыта на git здесь: https://github.com/danwrong/restler/issues/112, однако npm еще не обновил это, поэтому вы должны обратиться к git head.

    счастливый rest 🙂

    Я также получаю это предупреждение при установке aglio на моем mac osx.

    Я использую cmd для исправления.

     sudo npm install -g [email protected] 

    https://github.com/npm/npm/issues/13806

    В моем случае это был child.stderr.pipe(process.stderr) который вызывался, когда я child.stderr.pipe(process.stderr) 10 (или около того) экземпляров дочернего элемента. Итак, все, что приводит к подключению обработчика события к одному объекту EventEmitter в LOOP, заставляет nodejs выкидывать эту ошибку.

    Иногда эти предупреждения возникают, когда это не то, что мы сделали, а то, что мы забыли сделать!

    Я столкнулся с этим предупреждением, когда установил пакет dotenv с номером npm, но был прерван, прежде чем я успел добавить инструкцию require (‘dotenv’). Load () в начале моего приложения. Когда я вернулся к проекту, я начал получать предупреждения об обнаружении утечки «Возможная ошибка EventEmitter».

    Я предположил, что проблема была в том, что я сделал, а не в том, чего я не сделал!

    Как только я обнаружил свой надзор и добавил оператор require, предупреждение об утечке памяти очистилось.

    У меня было это до сегодняшнего дня, когда я начал grunt watch . Наконец,

     watch:{ options:{ maxListeners: 99, livereload: true }, } 

    Досадное сообщение исчезло.

    Вы сказали, что используете process.on('uncaughtException', callback);
    Где вы выполняете это заявление? Он находится в http.createServer переданном http.createServer ?
    Если да, другая копия того же обратного вызова будет привязана к событию uncaughtException при каждом новом запросе, потому что function (req, res) { ... } будет выполняться каждый раз, когда приходит новый запрос, и так будет выполняться инструкция process.on('uncaughtException', callback);
    Обратите внимание: объект процесса является глобальным для всех ваших запросов и добавляет слушателей к его событию каждый раз, когда приходит новый запрос, не имеет никакого смысла. Возможно, вы не захотите такого поведения.
    Если вы хотите добавить нового слушателя для каждого нового запроса, вы должны удалить все предыдущие прослушиватели, прикрепленные к событию, поскольку они больше не потребуются, используя:
    process.removeAllListeners('uncaughtException');

    Исправление нашей команды для этого – удаление пути реестра из нашего .npmrc. В файле rc у нас было два псевдонима пути, и один указывал на экземпляр Artifactory, который был устаревшим.

    Ошибка не имела никакого отношения к фактическому коду нашего приложения, но все, что связано с нашей средой разработки.

    У меня была такая же проблема. и проблема была вызвана тем, что я слушал порт 8080, на 2 слушателя.

    setMaxListeners() работает нормально, но я бы не рекомендовал его.

    правильный способ, проверить свой код для дополнительных слушателей, удалить слушателя или изменить номер порта, на котором вы слушаете, это исправило мою проблему.

    Я обновился от старой версии LTS, что-то еще, до новой версии LTS версии 8.9.4, и мои ошибки ушли.

    Я предпочитаю искать и исправлять проблемы, а не подавлять журналы, когда это возможно. После нескольких дней наблюдения за этой проблемой в моем приложении я понял, что настраивал слушателей на req.socket в промежуточном программном обеспечении Express, чтобы уловить ошибки сокета io, которые постоянно возникали. В какой-то момент я узнал, что это не обязательно, но я все равно слушал слушателей. Я просто удалил их, и ошибка, с которой вы столкнулись, ушла. Я подтвердил, что это было причиной, запустив запросы на мой сервер с и без следующего промежуточного программного обеспечения:

     socketEventsHandler(req, res, next) { req.socket.on("error", function(err) { console.error('------REQ ERROR') console.error(err.stack) }); res.socket.on("error", function(err) { console.error('------RES ERROR') console.error(err.stack) }); next(); } 

    Удаление этого промежуточного программного обеспечения остановило предупреждение, которое вы видите. Я бы посмотрел вокруг вашего кода и попытался найти везде, где вы можете настроить слушателей, которые вам не нужны.

    Поместите это в первую строку вашего server.js (или что-то еще, содержащее ваше основное приложение Node.js):

    require('events').EventEmitter.prototype._maxListeners = 0;

    и ошибка уходит 🙂

    Interesting Posts

    Нет маршрутов совпадений «/ users / sign_out» devise rails 3

    как точно вычислить инверсию матрицы?

    Создание тестовых данных в базе данных

    Модем -> Брандмауэр -> Коммутатор -> Беспроводная связь?

    Internet Explorer игнорирует cookies на некоторых доменах (не может читать или устанавливать cookies)

    Использование двоеточий для размещения двух операторов в одной строке в Visual Basic

    Локальные и Push-уведомления в совместимой версии IOS

    используя $ slice operator для получения последнего элемента массива в mongodb

    Как быстро и легко встроить шрифты в winforms app в C #

    Разделить фрейм данных на несколько выходных файлов

    Как создать файл CSV Excel C #?

    C ++ неявный конструктор копирования для classа, который содержит другие объекты

    Мне нужно запустить JFrame из другого JFrame и запустить его как независимые приложения, помочь?

    Интерференция при установке Windows XP

    Что произойдет, если скорость шины моей RAM не соответствует?

    Давайте будем гением компьютера.