Я использую node.js с socket.io, чтобы предоставить моей веб-странице доступ к символьным данным, обслуживаемым сокетом TCP. Я новичок в node.js.
Пользователь ---- > Веб-страница < - (socket.io) → node.js <; - (TCP) → Сервер TCP
Код милостиво краток:
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 все еще вызывает ошибку сокета - предлагает добавить обработчик для события "error", как я это делал в коде выше. Это именно то, как я хотел бы, чтобы он работал... кроме этого нет (для меня), моя программа не захватывает ECONNREFUSED.
Я попытался использовать RTFM, а node.js docs на http://nodejs.org/api/net.html#net_event_error_1 предположить, что действительно есть ошибка '- но не подсказывайте, как его использовать.
Ответы на другие похожие сообщения SO (такие как node.js Ошибка: подключение ECONNREFUSED) советуют глобальный обработчик неперехваченных исключений, но это похоже на плохое решение мне. Это не моя программа, которая бросает исключение из-за плохого кода, он отлично работает - предполагается, что он обрабатывает внешние сбои, как это было предусмотрено.
Итак,
- Я подхожу к этому правильно? (с удовольствием признаю, что это ошибка новичка).
- Можно ли делать то, что я хочу делать, и если да, то как?
Oh и:
$ node -v
v0.10.31