Я использую node.js с socket.io, чтобы предоставить моей веб-странице доступ к символьным данным, обслуживаемым сокетом TCP. Я довольно новичок в node.js.node.js - обработка ошибки сокета TCP ECONNREFUSED
пользователя ---->Web Page < - (socket.io) ->node.js < - (TCP) ->TCP Server
код милостиво краток:
io.on('connection', function (webSocket) {
tcpConnection = net.connect(5558, 'localhost', function() {});
tcpConnection.on('error', function(error) {
webSocket.emit('error', error);
tcpConnection.close();
});
tcpConnection.on('data', function(tcpData) {
webSocket.emit('data', { data: String.fromCharCode.apply(null, new Uint8Array(tcpData))});
});
});
это все прекрасно работает в обычном случае, но я не могу гарантировать, что сервер TCP будет там все время. Когда это не так, стек TCP возвращает ECONNREFUSED на node.js - это полностью ожидаемо, и мне нужно обработать его изящно. В настоящее время я вижу:
events.js:72
throw er; // Unhandled 'error' event
^
Error: connect ECONNREFUSED
at errnoException (net.js:904:11)
at Object.afterConnect [as oncomplete] (net.js:895:19)
... и весь процесс завершается.
Я много искал для этого решения; большинство хитов, похоже, от программистов, спрашивающих, почему ECONNREFUSED принимается в первую очередь, - а совет - просто убедиться, что TCP-сервер доступен. Никаких обсуждений об ошибках обработки.
Этот пост - Node.js connectListener still called on socket error - предлагает добавить обработчик для события 'error', как я сделал в коде выше. Это именно то, как я хотел бы, чтобы он работал ... кроме этого нет (для меня), моя программа не захватывает ECONNREFUSED.
Я пробовал RTFM, а node.js docs на http://nodejs.org/api/net.html#net_event_error_1 предполагают, что действительно есть событие «error», но мало подсказывайте, как его использовать.
Ответы на другие подобные сообщения SO (такие как Node.js Error: connect ECONNREFUSED) советуют глобальный неперехваченный обработчик исключений, но это кажется плохим решением для меня. Это не моя программа, бросающая исключение из-за плохого кода, он работает нормально - предполагается, что он обрабатывает внешние сбои, как это было разработано.
Так
- Am I приближается это в правильном направлении? (с удовольствием признаю, что это ошибка новичков)
- Можно ли делать то, что я хочу делать, и если да, то как?
О, и:
$ node -v
v0.10.31
проблема, скорее всего, в: 'TCPConnection = сеть. connect (5558, 'localhost', function() {}); 'невозможно подключиться. В коде мало что можно сделать, вам нужно убедиться, что порт 5558 на локальном хосте фактически открыт и прослушивается. – alandarev
Дело в том, что я не могу этого гарантировать. Тот факт, что он на localhost является красной селедкой, - представьте, что он был на каком-то удаленном сервере, где связь была не такой надежной, как localhost. Каждый другой язык программирования позволяет изящно улавливать ошибку (например, connect() в наборах C errno, connect (SocketAddress) в Java выдает исключение IOException и т. Д. И т. Д.). –