Как отладить ошибку зависания сокета в NodeJS?
Я получаю следующую ошибку:
events.js:48
throw arguments[1]; // Unhandled 'error' event
^
Error: socket hang up
at createHangUpError (http.js:1091:15)
at Socket.onend (http.js:1154:27)
at TCP.onread (net.js:363:26)
В node v0.6.6 мой код имеет несколько вызовов http.request и .get.
Пожалуйста, предложите способы отслеживания причин зависания сокета, и по какому запросу/вызову.
Спасибо вам
Ответы
Ответ 1
Быстрое и грязное решение для разработки:
Используйте longjohn, вы получите длинные трассировки стека, которые будут содержать операции async.
Чистое и правильное решение:
Технически, в node, когда вы выпустите событие 'error'
, и никто не слушает его, он будет бросать. Чтобы он не бросал, поставьте на него слушателя и обработайте его самостоятельно. Таким образом, вы можете зарегистрировать ошибку с дополнительной информацией.
Чтобы иметь одного слушателя для группы вызовов, вы можете использовать домены, а также уловить другие ошибки во время выполнения. Убедитесь, что каждая операция async, связанная с http (Server/Client), находится в другом domain контексте по сравнению с другими частями кода, домен будет автоматически прослушивать события error
и будет распространять его на свой собственный обработчик. Поэтому вы только слушаете этого обработчика и получаете данные об ошибках. Вы также можете получить дополнительную информацию бесплатно. (Домены обесценены).
В качестве Mike
вы также можете установить NODE_DEBUG=net
или использовать strace. Они оба предоставляют вам то, что node делает внутренне.
Ответ 2
Кроме того, вы можете установить переменную среды NODE_DEBUG
в net
, чтобы получить информацию о том, что делают все сокеты. Таким образом вы можете изолировать, какой удаленный ресурс сбрасывает соединение.
Ответ 3
В дополнение к ответу ftft1885
http.get(url, function(res)
{
var bodyChunks = [];
res.on('data', function(chunk)
{
// Store data chunks in an array
bodyChunks.push(chunk);
}).on('error', function(e)
{
// Call callback function with the error object which comes from the response
callback(e, null);
}).on('end', function()
{
// Call callback function with the concatenated chunks parsed as a JSON object (for example)
callback(null, JSON.parse(Buffer.concat(bodyChunks)));
});
}).on('error', function(e) {
// Call callback function with the error object which comes from the request
callback(e, null);
});
Когда у меня была ошибка "зависания сокета", это произошло потому, что я не улавливал ошибки запросов.
Ответ 4
использовать
req.on('error',function(err){})
Ответ 5
Скорее всего, ваше подключение к серверному сокету было каким-то образом закрыто до того, как все объекты http.ServerResponse закончились. Убедитесь, что вы остановили все входящие запросы перед тем, как что-то сделать с входящими подключениями (соединение с подключением отличается от входящего HTTP-запроса).