如何在NodeJS中调试套接字挂起错误?

时间:2012-05-30 10:29:31

标签: node.js sockets http debugging

我收到以下错误:

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 个答案:

答案 0 :(得分:38)

快速而肮脏的开发解决方案

使用longjohn,您将得到包含异步操作的长堆栈跟踪。

清洁且正确的解决方案: 从技术上讲,在节点中,只要you emit an 'error' event and no one listens to it, it will throw。为了使它不被抛出,请在其上放置一个监听器并自己处理它。这样,您可以使用更多信息记录错误。

要为一组调用创建一个侦听器,您可以使用domains并在运行时捕获其他错误。确保与http(服务器/客户端)相关的每个异步操作与代码的其他部分相比处于不同的domain上下文中,域将自动侦听error事件并将其传播到它自己的处理所以你只听那个处理程序并获取错误数据。 You also get more information for free. (域名被删除)。

Mike建议您也可以设置NODE_DEBUG=net或使用strace。它们都为您提供内部节点的功能。

答案 1 :(得分:14)

此外,您可以将NODE_DEBUG环境变量设置为net,以获取有关所有套接字正在执行的操作的信息。这样您就可以隔离哪个远程资源正在重置连接。

答案 2 :(得分:10)

除了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);
});

当我遇到“socket hang up”错误时,这是​​因为我没有捕获请求错误。

答案 3 :(得分:4)

使用

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

答案 4 :(得分:0)

在所有http.ServerResponse对象结束之前,很可能您的服务器套接字连接以某种方式关闭。在对传入连接执行某些操作之前,请确保已停止所有传入请求(包括连接与传入HTTP请求不同)。