2010-05-23 3 views
11

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

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

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

ответ

18

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

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

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

+0

Отличный ответ! Мой дополнительный вопрос здесь: какой обработчик ошибок (слушатель), как правило, должен делать: просто ошибка журнала или также вызов 'next' callback? –

14

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

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

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

это будет ловить все, что брошено ...

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

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

1

У меня была такая же проблема с примером сервером времени из here Мои клиенты получают убиты, а затем время сервер пытается пишите в закрытое гнездо.

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

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

stream.on('close', function() { 
    subscribers.remove(stream); 
    stream.end(); 
    console.log('Subscriber CLOSE: ' + subscribers.length + " total.\n"); 
}); 
Смежные вопросы