Я получаю следующее предупреждение:
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace:
at EventEmitter.<anonymous> (events.js:139:15)
at EventEmitter.<anonymous> (node.js:385:29)
at Server.<anonymous> (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);
Как это исправить?
process.on('warning', e => console.warn(e.stack));
для отладки предупреждения. Не используйте, такprocess.setMaxListeners(0);
как предупреждение есть по какой-то причине.yarn install
. где я могу поставить эту строку, чтобы добавить трассировку стека?Ответы:
Это объясняется в документации к узлу eventEmitter
Что это за версия Node? Какой другой код у вас есть? Это не нормальное поведение.
Короче говоря, его:
process.setMaxListeners(0);
Также смотрите: node.js - запрос - Как «emitter.setMaxListeners ()»?
источник
process.on('uncaughtException', callback);
process.setMaxListeners(0); // OMG, its so simple... :D
Здесь я хотел бы указать, что это предупреждение есть по причине, и есть большая вероятность, что правильное исправление не увеличивает предел, а выясняет, почему вы добавляете так много слушателей к одному и тому же событию. Увеличивайте лимит только в том случае, если вы знаете, почему добавляется так много слушателей, и уверены, что это то, чего вы действительно хотите.
Я нашел эту страницу, потому что получил это предупреждение, и в моем случае была ошибка в некотором коде, который я использовал, который превращал глобальный объект в EventEmitter! Я бы, конечно, посоветовал не увеличивать лимит в глобальном масштабе, потому что вы не хотите, чтобы эти вещи остались незамеченными.
источник
По умолчанию максимум 10 слушателей могут быть зарегистрированы для любого отдельного события.
Если это ваш код, вы можете указать maxListeners через:
Но если это не ваш код, вы можете использовать хитрость, чтобы увеличить ограничение по умолчанию во всем мире:
Конечно, вы можете отключить ограничения, но будьте осторожны:
КСТАТИ. Код должен быть в самом начале приложения.
ДОБАВИТЬ: начиная с узла 0.11, этот код также работает для изменения предела по умолчанию:
источник
Принятый ответ содержит семантику о том, как увеличить лимит, но, как указал @voltrevo, предупреждение есть по причине, и ваш код, вероятно, содержит ошибку.
Рассмотрим следующий ошибочный код:
Теперь рассмотрим правильный способ добавления слушателя:
Ищите похожие проблемы в своем коде перед изменением maxListeners (что объясняется в других ответах)
источник
Заменить
.on()
наonce()
. С помощьюonce()
удаляет прослушиватели событий, когда событие обрабатывается той же функцией.Если это не помогло, переустановите restler с этим в вашем package.json "restler": "git: //github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d"
Это связано с неправильной работой рестлера 0.10 с узлом. вы можете увидеть проблему закрытой на git здесь: https://github.com/danwrong/restler/issues/112 Однако npm еще не обновил это, поэтому вы должны обратиться к главе git.
источник
Я также получаю это предупреждение при установке aglio на мой Mac OSX.
Я использую CMD исправить это.
https://github.com/npm/npm/issues/13806
источник
Версия узла: v11.10.1
Предупреждение от трассировки стека:
После поиска проблем github, документирования и создания подобных утечек памяти генератора событий эта проблема наблюдалась из -за модуля node-apn, используемого для push-уведомлений iOS.
Это решило это:
Я создавал объект провайдера каждый раз, когда отправлялось уведомление, и ожидал, что gc его очистит.
источник
В моем случае это было то,
child.stderr.pipe(process.stderr)
что вызывали, когда я инициировал 10 (или около того) случаев ребенка. Таким образом, все, что приводит к присоединению обработчика событий к тому же объекту EventEmitter в LOOP, заставляет nodejs выдавать эту ошибку.источник
Иногда эти предупреждения появляются, когда это не то, что мы сделали, а то, что мы забыли сделать!
Я столкнулся с этим предупреждением, когда я установил пакет dotenv с помощью npm, но был прерван, прежде чем я смог добавить оператор require ('dotenv'). Load () в начале моего приложения. Вернувшись в проект, я начал получать предупреждения «Обнаружена утечка памяти в EventEmitter».
Я предположил, что проблема была в том, что я сделал, а не в том, что я не сделал!
Как только я обнаружил свой контроль и добавил оператор require, предупреждение об утечке памяти очистилось.
источник
Я предпочитаю выслеживать и исправлять проблемы, а не подавлять журналы всякий раз, когда это возможно. После нескольких дней наблюдения за этой проблемой в моем приложении я понял, что настраиваю слушателей
req.socket
в промежуточном программном обеспечении Express, чтобы ловить ошибки сокета io, которые продолжали появляться. В какой-то момент я узнал, что в этом нет необходимости, но я все равно держал слушателей. Я просто удалил их, и ошибка, с которой вы столкнулись, ушла. Я убедился, что это было причиной, запустив запросы к моему серверу со следующим промежуточным программным обеспечением и без него:Удаление этого промежуточного программного обеспечения остановило предупреждение, которое вы видите. Я бы посмотрел вокруг вашего кода и попытался найти то, где вы, возможно, настраиваете слушателей, которые вам не нужны.
источник
У меня была такая же проблема. и проблема была вызвана, потому что я слушал порт 8080, на 2 слушателя.
setMaxListeners()
работает отлично, но я бы не советовал.правильный путь - проверить код на наличие дополнительных прослушивателей, удалить прослушиватель или изменить номер порта, на котором вы слушаете, это решило мою проблему.
источник
У меня было это до сегодняшнего дня, когда я начинаю
grunt watch
. Наконец решеноРаздражающее сообщение ушло.
источник
Вы должны очистить всех слушателей перед созданием новых, используя:
Клиент / Сервер
Предполагая, что сокет - это ваш клиентский сокет / или созданный сокет сервера.
Вы также можете подписаться на определенных слушателей событий, например, удалив
connect
слушателя следующим образом:источник
Вы сказали, что используете
process.on('uncaughtException', callback);
Где вы выполняете это заявление? Это в пределах обратного вызова передано
http.createServer
?Если да, разные копии одного и того же обратного вызова будут прикрепляться к событию uncaughtException при каждом новом запросе, потому что они
function (req, res) { ... }
выполняются каждый раз, когда поступает новый запрос, и поэтому операторprocess.on('uncaughtException', callback);
Обратите внимание, что объект процесса является глобальным для всех ваших запросов и добавления слушателей. к его событию каждый раз, когда приходит новый запрос, не имеет никакого смысла. Вы можете не хотеть такого поведения.
Если вы хотите присоединить новый слушатель для каждого нового запроса, вы должны удалить всех предыдущих слушателей, прикрепленных к событию, так как они больше не потребуются, используя:
process.removeAllListeners('uncaughtException');
источник
Наша команда исправила это путем удаления пути реестра из нашего .npmrc. У нас было два псевдонима пути в файле rc, и один указывал на экземпляр Artifactory, который устарел.
Ошибка не имеет ничего общего с фактическим кодом нашего приложения, но все , чтобы сделать с нашей средой разработки.
источник
Я столкнулся с той же проблемой, но я успешно справился с асинхронным ожиданием.
Пожалуйста, проверьте, помогает ли это.
пусть dataLength = 25;
До:
for (пусть i = 0; i <dataLength; i ++) {
sftp.get (remotePath, fs.createWriteStream (
xyzProject/${data[i].name}
));}
После:
for (let i = 0; i <dataLength; i ++) {
await sftp.get (remotePath, fs.createWriteStream (
xyzProject/${data[i].name}
));}
источник
Спасибо RLaaa за предоставленную мне идею, как решить реальную проблему / первопричину предупреждения. Ну, в моем случае это был глючный код MySQL.
Если вы написали Promise с кодом внутри, вот так:
Обратите внимание, что
conn.on('error')
в коде есть слушатель. Этот код буквально добавляет слушателя снова и снова, зависит от того, сколько раз вы вызываете запрос. Тем временемif(err) reject(err)
делает то же самое.Поэтому я снял
conn.on('error')
слушателя и вуаля ... решил! Надеюсь, это поможет вам.источник
Поместите это в первую строку вашего server.js (или того, что содержит ваше основное приложение Node.js):
require('events').EventEmitter.prototype._maxListeners = 0;
и ошибка уходит :)
источник