Saya menjalankan aplikasi Express.js menggunakan Socket.io untuk webapp obrolan dan saya mendapatkan kesalahan berikut secara acak sekitar 5 kali selama 24 jam. Proses simpul dibungkus selamanya dan segera restart sendiri.
Masalahnya adalah me-restart Express menendang pengguna saya keluar dari kamar mereka dan tidak ada yang menginginkannya.
Server web diproksi oleh HAProxy. Tidak ada masalah stabilitas soket, hanya menggunakan soket web dan soket flash. Saya tidak bisa mereproduksi ini dengan sengaja.
Ini adalah kesalahan dengan Node v0.10.11
:
events.js:72
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET //alternatively it s a 'write'
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
error: Forever detected script exited with code: 8
error: Forever restarting script for 2 time
EDIT (2013-07-22)
Menambahkan kedua penangan kesalahan klien socket.io dan penangan pengecualian yang tidak tertangkap. Tampaknya yang ini menangkap kesalahan:
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NOT Exiting...");
});
Jadi saya menduga itu bukan masalah Socket.io tetapi permintaan HTTP ke server lain yang saya lakukan atau koneksi MySQL / Redis. Masalahnya adalah bahwa tumpukan kesalahan tidak membantu saya mengidentifikasi masalah kode saya. Berikut ini adalah output log:
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
Bagaimana saya tahu apa yang menyebabkan ini? Bagaimana cara saya mendapatkan lebih banyak dari kesalahan?
Ok, tidak terlalu verbose tapi inilah stacktrace dengan Longjohn:
Exception caught: Error ECONNRESET
{ [Error: read ECONNRESET]
code: 'ECONNRESET',
errno: 'ECONNRESET',
syscall: 'read',
__cached_trace__:
[ { receiver: [Object],
fun: [Function: errnoException],
pos: 22930 },
{ receiver: [Object], fun: [Function: onread], pos: 14545 },
{},
{ receiver: [Object],
fun: [Function: fireErrorCallbacks],
pos: 11672 },
{ receiver: [Object], fun: [Function], pos: 12329 },
{ receiver: [Object], fun: [Function: onread], pos: 14536 } ],
__previous__:
{ [Error]
id: 1061835,
location: 'fireErrorCallbacks (net.js:439)',
__location__: 'process.nextTick',
__previous__: null,
__trace_count__: 1,
__cached_trace__: [ [Object], [Object], [Object] ] } }
Di sini saya melayani file kebijakan soket flash:
net = require("net")
net.createServer( (socket) =>
socket.write("<?xml version=\"1.0\"?>\n")
socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n")
socket.write("<cross-domain-policy>\n")
socket.write("<allow-access-from domain=\"*\" to-ports=\"*\"/>\n")
socket.write("</cross-domain-policy>\n")
socket.end()
).listen(843)
Mungkinkah ini penyebabnya?
Jawaban:
Anda mungkin sudah menebaknya: ini adalah kesalahan koneksi.
"ECONNRESET" berarti sisi lain dari percakapan TCP tiba-tiba menutup ujung koneksi. Ini kemungkinan besar disebabkan oleh satu atau lebih kesalahan protokol aplikasi. Anda bisa melihat log server API untuk melihat apakah ada keluhan tentang sesuatu.
Tetapi karena Anda juga mencari cara untuk memeriksa kesalahan dan berpotensi men-debug masalah, Anda harus melihat " Bagaimana cara men-debug kesalahan menutup sambungan soket di NodeJS? " Yang diposting di stackoverflow sehubungan dengan pertanyaan yang sama.
EDIT (2013-07-22)
Seperti yang saya tulis di atas:
Apa yang bisa juga terjadi: pada waktu yang acak, pihak lain kelebihan beban dan hanya membunuh koneksi sebagai hasilnya. Jika itu masalahnya, tergantung pada apa yang Anda hubungkan dengan tepat ...
Tapi satu hal yang pasti: Anda memang memiliki kesalahan baca pada koneksi TCP Anda yang menyebabkan pengecualian. Anda dapat melihatnya dengan melihat kode kesalahan yang Anda poskan di edit, yang menegaskan hal itu.
sumber
Server tcp sederhana yang saya miliki untuk melayani file kebijakan flash menyebabkan ini. Sekarang saya dapat menangkap kesalahan menggunakan handler:
sumber
socket.destroy()
penangan kesalahan untuk memastikan. Sayangnya saya tidak dapat menemukan dokumentasi apakah itu diperlukan, tetapi tidak memunculkan kesalahan untuk melakukannya.Saya memiliki masalah serupa di mana aplikasi mulai error setelah peningkatan Node. Saya percaya ini dapat ditelusuri kembali ke rilis Node v0.9.10 item ini:
Versi sebelumnya tidak akan kesalahan pada gangguan dari klien. Pemutusan koneksi dari klien melempar kesalahan ECONNRESET di Node. Saya percaya ini dimaksudkan fungsionalitas untuk Node, jadi perbaikannya (setidaknya untuk saya) adalah untuk menangani kesalahan, yang saya yakin Anda lakukan dalam pengecualian tanpa pamrih. Meskipun saya menanganinya di net.socket handler.
Anda dapat menunjukkan ini:
Buat server soket sederhana dan dapatkan Node v0.9.9 dan v0.9.10.
Mulai menggunakan v0.9.9 dan kemudian coba FTP ke server ini. Saya menggunakan FTP dan port 21 hanya karena saya menggunakan Windows dan memiliki klien FTP, tetapi tidak ada klien telnet yang praktis.
Kemudian dari sisi klien, putuskan koneksi. (Saya hanya melakukan Ctrl-C)
Anda seharusnya melihat NO ERROR saat menggunakan Node v0.9.9, dan ERROR saat menggunakan Node v.0.9.10 dan yang lebih tinggi.
Dalam produksi, saya menggunakan v.0.10. sesuatu dan itu masih memberikan kesalahan. Sekali lagi, saya pikir ini dimaksudkan dan solusinya adalah untuk menangani kesalahan dalam kode Anda.
sumber
Punya masalah yang sama hari ini. Setelah beberapa penelitian saya menemukan
--abort-on-uncaught-exception
opsi node.js yang sangat berguna . Tidak hanya menyediakan jauh lebih banyak verbose dan jejak stack kesalahan berguna, tetapi juga menyimpan file inti pada aplikasi crash memungkinkan debug lebih lanjut.sumber
Saya menghadapi masalah yang sama tetapi saya mengatasinya dengan menempatkan:
sebelumnya
server.listen
.server
adalah server HTTP di sini. Batas waktu default adalah 2 menit sesuai dokumentasi API .sumber
Kasus lain yang mungkin (tetapi jarang) dapat terjadi jika Anda memiliki komunikasi server ke server dan telah menetapkan
server.maxConnections
nilai yang sangat rendah.Dalam core lib net.js ia akan memanggil
clientHandle.close()
yang juga akan menyebabkan kesalahan ECONNRESET:sumber
maxConnections
nilai standarnya adalahInfinity
. Ini hanya akan menjadi kasus (seperti yang Anda katakan) jika Anda telah secara eksplisit menimpa nilai itu.Ya, penyajian Anda file kebijakan pasti dapat menyebabkan kerusakan.
Untuk mengulang, tambahkan saja penundaan ke kode Anda:
... dan gunakan
telnet
untuk terhubung ke port. Jika Anda memutuskan koneksi telnet sebelum penundaan berakhir, Anda akan mendapatkan crash (pengecualian tanpa tertangkap) ketika socket.write melempar kesalahan.Untuk menghindari kerusakan di sini, cukup tambahkan penangan kesalahan sebelum membaca / menulis soket:
Ketika Anda mencoba putuskan di atas, Anda hanya akan mendapatkan pesan log daripada crash.
Dan setelah selesai, ingatlah untuk menghapus penundaan.
sumber
Saya juga mendapatkan kesalahan ECONNRESET selama pengembangan saya, cara saya menyelesaikannya adalah dengan tidak menggunakan nodemon untuk memulai server saya, cukup gunakan
"node server.js"
untuk memulai server saya perbaiki masalah saya.Aneh, tapi itu berhasil untuk saya, sekarang saya tidak pernah melihat kesalahan ECONNRESET lagi.
sumber
Saya juga memiliki Kesalahan ini dan dapat menyelesaikannya setelah berhari-hari melakukan debugging dan analisis:
solusi saya
Bagi saya VirtualBox (untuk Docker) adalah Masalahnya. Saya memiliki Port Forwarding yang dikonfigurasi pada VM saya dan kesalahan hanya terjadi pada port yang diteruskan.
kesimpulan umum
Pengamatan berikut dapat menghemat hari kerja yang harus saya investasikan:
-> mencari tahu apakah ada sesuatu yang main-main dengan jaringan Anda (-pengaturan), seperti VM, Firewall dll, ini mungkin penyebab masalahnya.
sumber
Saya memecahkan masalah hanya dengan menghubungkan ke jaringan yang berbeda . Itu adalah salah satu masalah yang mungkin terjadi.
Seperti yang dibahas di atas, ECONNRESET berarti bahwa percakapan TCP tiba-tiba menutup ujung koneksi.
Koneksi internet Anda mungkin menghalangi Anda untuk terhubung ke beberapa server. Dalam kasus saya, saya mencoba untuk terhubung ke mLab (layanan database cloud yang menampung database MongoDB). Dan ISP saya memblokirnya.
sumber
Saya telah mengatasi masalah ini dengan:
npm update
di terminal untuk memperbarui npm.Setelah itu saya mencoba perintah npm yang sama dan hal yang baik berhasil. Saya tidak yakin sesederhana itu.
Saya menggunakan CENTOS 7
sumber
Saya memiliki masalah yang sama dan tampaknya versi Node.js adalah masalahnya.
Saya menginstal versi Node.js sebelumnya (10.14.2) dan semuanya baik-baik saja menggunakan nvm (memungkinkan Anda untuk menginstal beberapa versi Node.js dan dengan cepat beralih dari satu versi ke versi lain).
Ini bukan solusi "bersih", tetapi dapat melayani Anda untuk sementara waktu.
sumber
Saya baru saja menemukan ini, setidaknya dalam kasus penggunaan saya.
Saya mendapatkan
ECONNRESET
. Ternyata cara klien saya diatur, itu memukul server dengan panggilan API satu ton kali dengan sangat cepat - dan hanya perlu mencapai titik akhir sekali.Ketika saya memperbaikinya, kesalahan sudah hilang.
sumber
Coba tambahkan opsi ini ke socket.io:
Saya harap ini akan membantu Anda!
sumber