Как отладить ошибку зависания сокета в 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);
});
Когда у меня была эта ошибка "зависания сокета", это было потому, что я не ловил ошибки запросов.
Скорее всего, ваше сокетное соединение с сервером было каким-то образом закрыто до того, как все объекты http.ServerResponse закончились. Убедитесь, что вы остановили все входящие запросы, прежде чем делать что-то с входящими соединениями (входящее соединение отличается от входящего HTTP-запроса).