Непостижимые ошибки в node.js - PullRequest
11 голосов
/ 24 мая 2010

Итак, я пытаюсь написать простой сервер сокетов TCP, который передает информацию всем подключенным клиентам.Поэтому, когда пользователь подключается, он добавляется в список клиентов, а когда поток генерирует событие close, он удаляется из списка клиентов.

Это работает хорошо, за исключением того, что иногда я отправляюсообщение, как только пользователь отключается.

Я пробовал обернуть stream.write() в блок try/catch, но не повезло.Кажется, что ошибка неуловима.

Ответы [ 3 ]

18 голосов
/ 24 мая 2010

Решение состоит в том, чтобы добавить прослушиватель для события 'error' потока.Поначалу это может показаться нелогичным, но это оправдано.

stream.write () отправляет данные асинхронно.К тому времени, когда этот узел осознал, что запись в сокет вызвала ошибку, на которую переместился ваш код, после вызова stream.write, поэтому у него нет возможности вызвать ошибку там.

Вместо этого,то, что делает узел в этой ситуации, отправляет событие «error» из потока, и EventEmitter кодируется так, что если нет прослушивателей для события «error», ошибка возникает как исключение верхнего уровня, и процесс заканчивается.

15 голосов
/ 20 октября 2010

Питер совершенно прав,

и есть еще один способ, вы также можете сделать обработчик ошибок всех перехватов с помощью

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

, который поймает все, что выброшено ...

обычно лучше, если это возможно, сделать так, как это делает Питер, однако если вы пишете, скажем, тестовый фреймворк, возможно, будет хорошей идеей использовать process.on('uncaughtException',...

здесьСуть, которая охватывает (я думаю) все различные способы обработки ошибок в nodejs http://gist.github.com/636290

1 голос
/ 17 февраля 2012

У меня была такая же проблема с примером сервера времени из здесь Мои клиенты убиты, а сервер времени пытается выполнить запись в закрытый сокет.

Установка обработчика ошибок не работаеттак как событие ошибки срабатывает только при получении.Сервер времени не получает (см. Документацию по событию потока).

Мое решение - установить обработчик для события закрытия потока.

stream.on('close', function() {
    subscribers.remove(stream);
    stream.end();
    console.log('Subscriber CLOSE: ' + subscribers.length + " total.\n");
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...