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?