Как отладить ошибку зависания сокета в 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-запроса).