Saya mendapatkan peringatan berikut:
(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)
Saya menulis kode seperti ini di server.js:
http.createServer(
function (req, res) { ... }).listen(3013);
Bagaimana cara memperbaikinya?
process.on('warning', e => console.warn(e.stack));
untuk men-debug peringatan. Jangan gunakanprocess.setMaxListeners(0);
karena peringatan ada karena alasan tertentu.yarn install
. di mana saya bisa meletakkan baris ini untuk menambahkan jejak stack?Jawaban:
Ini dijelaskan dalam dokumentasi eventEmitter node
Node versi apa ini? Apa kode lain yang Anda miliki? Itu bukan perilaku normal.
Singkatnya, ini:
process.setMaxListeners(0);
Juga lihat: node.js - request - Bagaimana "emitter.setMaxListeners ()"?
sumber
process.on('uncaughtException', callback);
process.setMaxListeners(0); // OMG, its so simple... :D
Saya ingin menunjukkan di sini bahwa peringatan itu ada karena suatu alasan dan ada peluang bagus perbaikan yang tepat tidak meningkatkan batas tetapi mencari tahu mengapa Anda menambahkan begitu banyak pendengar ke acara yang sama. Tingkatkan batas jika Anda tahu mengapa begitu banyak pendengar ditambahkan dan yakin itulah yang Anda inginkan.
Saya menemukan halaman ini karena saya mendapat peringatan ini dan dalam kasus saya ada bug dalam beberapa kode yang saya gunakan yang mengubah objek global menjadi EventEmitter! Saya tentu saja menyarankan untuk tidak meningkatkan batas secara global karena Anda tidak ingin hal-hal ini tidak diperhatikan.
sumber
Secara default, maksimal 10 pendengar dapat didaftarkan untuk acara apa pun.
Jika ini kode Anda, Anda dapat menentukan maxListeners melalui:
Tetapi jika itu bukan kode Anda, Anda dapat menggunakan trik ini untuk meningkatkan batas default secara global:
Tentu saja Anda dapat mematikan batas tetapi hati-hati:
BTW. Kode harus berada di awal aplikasi.
TAMBAH: Karena simpul 0.11 kode ini juga berfungsi untuk mengubah batas default:
sumber
Jawaban yang diterima memberikan semantik tentang cara meningkatkan batas, tetapi seperti @voltrevo menunjukkan bahwa peringatan ada karena suatu alasan dan kode Anda mungkin memiliki bug.
Pertimbangkan kode kereta berikut:
Sekarang perhatikan cara menambahkan pendengar yang benar:
Cari masalah serupa dalam kode Anda sebelum mengubah maxListeners (yang dijelaskan dalam jawaban lain)
sumber
Ganti
.on()
denganonce()
. Menggunakanonce()
menghilangkan pendengar acara ketika acara ditangani oleh fungsi yang sama.Jika ini tidak memperbaikinya, instal ulang restler dengan ini di package.json Anda "restler": "git: //github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d"
Ini ada hubungannya dengan restler 0.10 nakal dengan node. Anda dapat melihat masalah ditutup pada git di sini: https://github.com/danwrong/restler/issues/112 Namun, npm belum memperbarui ini, jadi itu sebabnya Anda harus merujuk ke kepala git.
sumber
Saya mendapatkan peringatan ini juga ketika menginstal aglio di mac osx saya.
Saya menggunakan cmd memperbaikinya.
https://github.com/npm/npm/issues/13806
sumber
Versi Node: v11.10.1
Pesan peringatan dari tumpukan jejak:
Setelah mencari masalah github, dokumentasi dan membuat kebocoran memori emitor peristiwa serupa, masalah ini diamati karena modul node-apn digunakan untuk notifikasi push iOS.
Ini menyelesaikannya:
Saya membuat objek penyedia setiap kali pemberitahuan dikirim dan mengharapkan gc untuk menghapusnya.
sumber
Dalam kasus saya, itu
child.stderr.pipe(process.stderr)
yang dipanggil ketika saya memulai 10 (atau lebih) contoh anak. Jadi apa pun, yang mengarah untuk melampirkan pengendali acara ke Objek EventEmitter yang sama di LOOP, menyebabkan nodejs untuk melempar kesalahan ini.sumber
Terkadang peringatan ini muncul ketika itu bukan sesuatu yang kami lakukan, tetapi sesuatu yang kami lupa lakukan!
Saya mengalami peringatan ini ketika saya menginstal paket dotenv dengan npm, tetapi terputus sebelum saya menambahkan pernyataan need ('dotenv'). Load () di awal aplikasi saya. Ketika saya kembali ke proyek, saya mulai mendapatkan peringatan "Kemungkinan kebocoran memori EventEmitter terdeteksi".
Saya berasumsi masalahnya adalah dari sesuatu yang telah saya lakukan, bukan sesuatu yang belum saya lakukan!
Setelah saya menemukan pengawasan saya dan menambahkan pernyataan yang diperlukan, peringatan kebocoran memori dihapus.
sumber
Saya lebih memilih untuk memburu dan memperbaiki masalah daripada menekan log bila memungkinkan. Setelah beberapa hari mengamati masalah ini di aplikasi saya, saya menyadari bahwa saya sedang mengatur pendengar di
req.socket
dalam middleware Express untuk menangkap kesalahan socket io yang terus bermunculan. Pada titik tertentu, saya belajar bahwa itu tidak perlu, tetapi saya tetap menjaga pendengar di sekitar. Saya baru saja menghapusnya dan kesalahan yang Anda alami hilang. Saya memverifikasi penyebabnya dengan menjalankan permintaan ke server saya dengan dan tanpa middleware berikut:Menghapus middleware itu menghentikan peringatan yang Anda lihat. Saya akan melihat-lihat kode Anda dan mencoba mencari di mana saja Anda mungkin mengatur pendengar yang tidak Anda butuhkan.
sumber
Saya mengalami masalah yang sama. dan masalahnya disebabkan karena saya mendengarkan port 8080, pada 2 pendengar.
setMaxListeners()
berfungsi dengan baik, tetapi saya tidak akan merekomendasikan hal ini.cara yang benar adalah dengan, memeriksa kode Anda untuk pendengar tambahan, menghapus pendengar atau mengubah nomor port yang Anda dengarkan, ini memperbaiki masalah saya.
sumber
Saya mengalami ini sampai hari ini ketika saya mulai
grunt watch
. Akhirnya diselesaikan olehPesan yang menjengkelkan hilang.
sumber
Anda harus menghapus semua pendengar sebelum membuat yang baru menggunakan:
Server klien
Soket asumsi adalah soket klien Anda / atau soket server yang dibuat.
Anda juga dapat berlangganan dari pendengar acara tertentu seperti misalnya menghapus
connect
pendengar seperti ini:sumber
Anda bilang Anda menggunakan
process.on('uncaughtException', callback);
Di mana Anda menjalankan pernyataan ini? Apakah dalam callback diteruskan ke
http.createServer
?Jika ya, salinan berbeda dari panggilan balik yang sama akan dilampirkan ke acara uncaughtException atas setiap permintaan baru, karena
function (req, res) { ... }
dieksekusi setiap kali permintaan baru masuk dan begitu juga pernyataanprocess.on('uncaughtException', callback);
Perhatikan bahwa objek proses global untuk semua permintaan Anda dan menambahkan pendengar ke acara setiap kali permintaan baru masuk tidak akan masuk akal. Anda mungkin tidak menginginkan perilaku seperti itu.
Jika Anda ingin melampirkan pendengar baru untuk setiap permintaan baru, Anda harus menghapus semua pendengar sebelumnya yang dilampirkan ke acara tersebut karena mereka tidak lagi diharuskan menggunakan:
process.removeAllListeners('uncaughtException');
sumber
Perbaikan tim kami untuk ini adalah menghapus jalur registri dari .npmrc kami. Kami memiliki dua alias path dalam file rc, dan satu menunjuk ke instance Artifactory yang telah usang.
Kesalahan itu tidak ada hubungannya dengan kode aktual Aplikasi kami, tetapi semuanya terkait dengan lingkungan pengembangan kami.
sumber
Saya menghadapi masalah yang sama, tetapi saya telah berhasil menangani async menunggu.
Silakan periksa apakah itu membantu.
biarkan dataLength = 25;
Sebelum:
untuk (mis. I = 0; i <dataLength; i ++) {
sftp.get (remotePath, fs.createWriteStream (
xyzProject/${data[i].name}
));}
After:
for (let i = 0; i <dataLength; i ++) {
tunggu sftp.get (remotePath, fs.createWriteStream (
xyzProject/${data[i].name}
));}
sumber
Terima kasih kepada RLaaa untuk memberi saya ide bagaimana menyelesaikan masalah sebenarnya / akar penyebab peringatan. Nah dalam kasus saya itu adalah kode kereta MySQL.
Memberikan Anda menulis Janji dengan kode di dalamnya seperti ini:
Perhatikan ada
conn.on('error')
pendengar dalam kodenya. Kode yang secara harfiah menambahkan pendengar berulang tergantung pada berapa kali Anda memanggil kueri. Sementara ituif(err) reject(err)
melakukan hal yang sama.Jadi saya menghapus
conn.on('error')
pendengar dan voila ... terpecahkan! Semoga ini bisa membantu Anda.sumber
Letakkan ini di baris pertama server.js Anda (atau apa pun yang berisi aplikasi Node.js utama Anda):
require('events').EventEmitter.prototype._maxListeners = 0;
dan kesalahan hilang :)
sumber