2010-05-23 35 views
11

Vì vậy, tôi đang cố gắng viết một máy chủ socket TCP đơn giản phát sóng thông tin tới tất cả các máy khách được kết nối. Vì vậy, khi người dùng kết nối, họ sẽ được thêm vào danh sách khách hàng và khi luồng phát ra sự kiện gần, họ sẽ bị xóa khỏi danh sách khách hàng.Lỗi không thể so sánh trong node.js

Tính năng này hoạt động tốt, ngoại trừ việc thỉnh thoảng tôi gửi tin nhắn giống như người dùng ngắt kết nối.

Tôi đã thử gói stream.write() trong khối try/catch, nhưng không có may mắn. Dường như lỗi là không thể sửa được.

Trả lời

18

Giải pháp là thêm người nghe cho sự kiện 'lỗi' của luồng. Điều này có vẻ phản trực giác lúc đầu, nhưng biện minh cho nó là âm thanh.

stream.write() gửi dữ liệu không đồng bộ. Vào thời điểm mà nút đã nhận ra rằng việc ghi vào ổ cắm đã gây ra lỗi mà mã của bạn đã di chuyển, qua lời gọi tới stream.write, vì vậy không có cách nào để nó tăng lỗi ở đó. Thay vào đó, nút nào trong tình huống này phát ra một sự kiện 'lỗi' từ luồng, và EventEmitter được mã hóa sao cho nếu không có người nghe cho một sự kiện 'lỗi', lỗi được nêu ra như một ngoại lệ to lớn, và quá trình kết thúc.

+0

Câu trả lời hay! Câu hỏi bổ sung của tôi ở đây: những gì xử lý lỗi (nghe) thường được giả sử để làm: chỉ cần đăng nhập lỗi hoặc cũng gọi 'next' gọi lại? –

14

Peter là hoàn toàn đúng,

và đó cũng là một cách khác, bạn cũng có thể làm cho một nắm bắt tất cả các xử lý lỗi với

process.on('uncaughtException',function(error){ 
// process error 
}) 

này sẽ bắt tất cả mọi thứ mà được ném ...

thường tốt hơn nếu bạn làm theo cách này của peter, nếu có thể, tuy nhiên nếu bạn viết một khung kiểm tra, bạn nên sử dụng process.on('uncaughtException',...

đây là một ý chính trong đó bao gồm (i think) tất cả các aways lỗi khác nhau xử lý trong nodejs http://gist.github.com/636290

1

tôi đã cùng một vấn đề với ví dụ thời gian máy chủ từ here khách hàng của tôi bị thiệt mạng và máy chủ thời gian sau đó cố gắng ghi vào ổ cắm kín.

Đặt trình xử lý lỗi không hoạt động vì sự kiện lỗi chỉ kích hoạt khi nhận. Máy chủ thời gian không nhận được, (xem tài liệu sự kiện luồng).

Giải pháp của tôi là đặt trình xử lý trên sự kiện đóng luồng.

stream.on('close', function() { 
    subscribers.remove(stream); 
    stream.end(); 
    console.log('Subscriber CLOSE: ' + subscribers.length + " total.\n"); 
}); 
Các vấn đề liên quan