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

В узле v0.6.6 мой код имеет несколько вызовов http.request и.get. Пожалуйста, предложите способы отследить, что вызывает зависание сокета, и на каком запросе / вызове это происходит. Спасибо

5 ответов

Быстрое и грязное решение для разработки:

Используйте longjohn, вы получите длинные трассировки стека, которые будут содержать асинхронные операции.

Чистое и правильное решение: Технически, в узле, всякий раз, когда вы излучаете 'error' событие и никто его не слушает, оно бросит. Чтобы он не бросался, поместите слушателя в него и разберитесь с этим сами. Таким образом, вы можете записать ошибку с дополнительной информацией.

Чтобы иметь одного прослушивателя для группы вызовов, вы можете использовать домены, а также ловить другие ошибки во время выполнения. Убедитесь, что каждая асинхронная операция, связанная с http (сервер / клиент), находится в другом доменном контексте, по сравнению с другими частями кода, домен автоматически прослушивает error события и будет распространять его в свой собственный обработчик. Таким образом, вы только слушаете этот обработчик и получаете данные об ошибках. Вы также получите больше информации бесплатно. (Домены устарели).

Как Mike предложил вы также можете установить NODE_DEBUG=net или используйте strace. Они оба предоставляют вам то, что делает узел внутренне.

Кроме того, вы можете установить NODE_DEBUG переменная среды для net чтобы получить информацию о том, что делают все сокеты. Таким образом, вы можете определить, какой удаленный ресурс сбрасывает соединение.

В дополнение к ответу 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);
});

Когда у меня была эта ошибка "зависания сокета", это было потому, что я не ловил ошибки запросов.

Использование

req.on('error',function(err){})

Скорее всего, ваше сокетное соединение с сервером было каким-то образом закрыто до того, как все объекты http.ServerResponse закончились. Убедитесь, что вы остановили все входящие запросы, прежде чем делать что-то с входящими соединениями (входящее соединение отличается от входящего HTTP-запроса).

Другие вопросы по тегам