Tôi đang chạy một ứng dụng Express.js bằng cách sử dụng Socket.io cho một ứng dụng web trò chuyện và tôi nhận được lỗi sau đây ngẫu nhiên khoảng 5 lần trong 24 giờ. Quá trình nút được gói trong mãi mãi và nó tự khởi động lại ngay lập tức.
Vấn đề là việc khởi động lại Express khiến người dùng của tôi rời khỏi phòng của họ và không ai muốn điều đó.
Máy chủ web được ủy quyền bởi HAProxy. Không có vấn đề ổn định ổ cắm, chỉ sử dụng vận chuyển websockets và flashsockets. Tôi không thể tái tạo điều này trên mục đích.
Đây là lỗi với 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)
Đã thêm cả trình xử lý lỗi máy khách socket.io và trình xử lý ngoại lệ chưa được lưu. Có vẻ như điều này bắt lỗi:
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NOT Exiting...");
});
Vì vậy, tôi nghi ngờ đây không phải là sự cố của Socket.io mà là yêu cầu HTTP đến một máy chủ khác mà tôi thực hiện hoặc kết nối MySQL / Redis. Vấn đề là ngăn xếp lỗi không giúp tôi xác định được vấn đề về mã của mình. Đây là đầu ra nhật ký:
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
Làm thế nào để tôi biết những gì gây ra điều này? Làm thế nào để tôi nhận được nhiều hơn từ lỗi?
Ok, không dài dòng lắm nhưng đây là stacktrace với 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] ] } }
Ở đây tôi phục vụ tệp chính sách ổ cắm 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)
Đây có thể là nguyên nhân?