У меня есть ошибка, и я не знаю, как ее исправить. Такое бывает всего несколько раз.
Сообщение об ошибке:
(node:9140) MaxListenersExceededWarning: Possible EventEmitter memory leak detec
ted. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
Мой JS-код слишком длинный, чтобы размещать его здесь, то же самое для package.json
Что ж, без этого невозможно сосредоточиться на конкретной проблеме, с которой вы сталкиваетесь. Могут быть предложены только общие рекомендации. Попробуйте рекомендации здесь





Эта ошибка часто возникает, когда вы прямо или косвенно используете EventEmitter в своем коде и создаете слишком много Promise за слишком короткий период, чтобы их можно было разрешить - Node обнаруживает это как утечку памяти и выдает ошибку, когда максимальное количество слушателей превышено.
Например, часто в модульных тестах часто устанавливаются предварительные условия и отменяются предварительные условия до и после каждого теста. Участники тестирования, такие как Mocha, часто проводят тесты параллельно. Если у вас есть десятки тестов, вы можете быстро увеличить количество прослушивателей событий до максимума, если ваша установка выполняет операции, которые генерируют события (например, подключение к базе данных).
Без вашего конкретного кода было бы трудно определить причину. Я рекомендую вам просмотреть свой код на предмет любых излучателей событий, которые вы, возможно, использовали, напрямую или в модулях, которые вы включаете, и поискать любые случаи, когда вы можете непреднамеренно создавать слишком много из них параллельно (например, через async или EventEmitter) . Ключевым моментом является поиск мест в вашем коде, где у вас много «параллельное исполнение», таких как циклы с обещаниями.
По умолчанию Node обычно разрешает максимум 10 слушателей. Вы можете изменить количество эмиттеров, которое Node позволит использовать:
setMaxListeners(n);
Однако вы должны знать, что это всего лишь предупреждение, и оно предназначено для помощи разработчику, предупреждая его, когда у него есть код, который может вызвать утечку памяти.
Спасибо. я сделаю это
Джей, большое спасибо за ответ, ты молодец. Если честно, проблема все еще существует. Некоторое время назад у меня было такое же предупреждение, которое не останавливает код блока, и он исчезает без причины. Не знаю, что мне делать, может, снова исчезну. В вашем ответе вы правы, я использую много обещаний и асинхронных запросов к БД. Без этих функций мой код работать не будет. Тем не менее, я постараюсь уменьшить это количество и сделать несколько расширенных запросов, чтобы минимизировать общее количество промисов.
Привет, Степан, причина, по которой проблемы возникают и исчезают без видимой причины, связана с обещаниями и асинхронным кодом, выполняющимся в условиях гонки. Если у вас есть несколько обещаний с эмиттерами событий, выполнение которых занимает больше времени, то в конечном итоге это произойдет. Если вы можете предоставить модуль npm, который используете для подключения к базе данных, мы сможем точно определить причину эмиттеров. Большинство модулей подключения к БД и ORM генерируют события для таких вещей, как открытие, закрытие соединения и ошибки. Например, модуль redis делает это - npmjs.com/package/redis#api
Это не дает достаточно информации. Добавьте свой JS-код и package.json. Как объясняется в сообщении, есть способ избежать этого предупреждения, увеличив лимит, но сначала вы должны просканировать свой код, чтобы увидеть, не прикреплены ли к событиям какие-либо ненужные слушатели.