Nodejs MaxListenersExceededWarning

У меня есть ошибка, и я не знаю, как ее исправить. Такое бывает всего несколько раз.

Сообщение об ошибке:

(node:9140) MaxListenersExceededWarning: Possible EventEmitter memory leak detec
ted. 11 error listeners added. Use emitter.setMaxListeners() to increase limit

Это не дает достаточно информации. Добавьте свой JS-код и package.json. Как объясняется в сообщении, есть способ избежать этого предупреждения, увеличив лимит, но сначала вы должны просканировать свой код, чтобы увидеть, не прикреплены ли к событиям какие-либо ненужные слушатели.

Vasan 20.04.2018 18:32

Мой JS-код слишком длинный, чтобы размещать его здесь, то же самое для package.json

Stepan Rafael 20.04.2018 18:34

Что ж, без этого невозможно сосредоточиться на конкретной проблеме, с которой вы сталкиваетесь. Могут быть предложены только общие рекомендации. Попробуйте рекомендации здесь

Vasan 20.04.2018 18:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
3
6 928
1

Ответы 1

Эта ошибка часто возникает, когда вы прямо или косвенно используете EventEmitter в своем коде и создаете слишком много Promise за слишком короткий период, чтобы их можно было разрешить - Node обнаруживает это как утечку памяти и выдает ошибку, когда максимальное количество слушателей превышено.

Например, часто в модульных тестах часто устанавливаются предварительные условия и отменяются предварительные условия до и после каждого теста. Участники тестирования, такие как Mocha, часто проводят тесты параллельно. Если у вас есть десятки тестов, вы можете быстро увеличить количество прослушивателей событий до максимума, если ваша установка выполняет операции, которые генерируют события (например, подключение к базе данных).

Без вашего конкретного кода было бы трудно определить причину. Я рекомендую вам просмотреть свой код на предмет любых излучателей событий, которые вы, возможно, использовали, напрямую или в модулях, которые вы включаете, и поискать любые случаи, когда вы можете непреднамеренно создавать слишком много из них параллельно (например, через async или EventEmitter) . Ключевым моментом является поиск мест в вашем коде, где у вас много «параллельное исполнение», таких как циклы с обещаниями.

По умолчанию Node обычно разрешает максимум 10 слушателей. Вы можете изменить количество эмиттеров, которое Node позволит использовать:

setMaxListeners(n);

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

Спасибо. я сделаю это

Stepan Rafael 20.04.2018 19:49

Джей, большое спасибо за ответ, ты молодец. Если честно, проблема все еще существует. Некоторое время назад у меня было такое же предупреждение, которое не останавливает код блока, и он исчезает без причины. Не знаю, что мне делать, может, снова исчезну. В вашем ответе вы правы, я использую много обещаний и асинхронных запросов к БД. Без этих функций мой код работать не будет. Тем не менее, я постараюсь уменьшить это количество и сделать несколько расширенных запросов, чтобы минимизировать общее количество промисов.

Stepan Rafael 01.05.2018 02:03

Привет, Степан, причина, по которой проблемы возникают и исчезают без видимой причины, связана с обещаниями и асинхронным кодом, выполняющимся в условиях гонки. Если у вас есть несколько обещаний с эмиттерами событий, выполнение которых занимает больше времени, то в конечном итоге это произойдет. Если вы можете предоставить модуль npm, который используете для подключения к базе данных, мы сможем точно определить причину эмиттеров. Большинство модулей подключения к БД и ORM генерируют события для таких вещей, как открытие, закрытие соединения и ошибки. Например, модуль redis делает это - npmjs.com/package/redis#api

JayReardon 04.05.2018 19:08

Другие вопросы по теме