it-roy-ru.com

Как отладить ошибку зависания сокета в 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 . Пожалуйста, предложите способы отследить, что вызывает зависание сокета, и на каком запросе/вызове это . Спасибо

44
user971956

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

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

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

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

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

37
Farid Nouri Neshat

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

13
Mike

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

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

10
FWoelffel

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

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

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

0
Mateusz Charytoniuk