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

use*_*956 50 sockets debugging http node.js

我收到以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

在节点v0.6.6中,我的代码有多个http.request和.get调用.请建议如何跟踪导致套接字挂断的原因以及请求/呼叫的方式.谢谢

Far*_*hat 40

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

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

清晰且正确的解决方案:从技术上讲,在节点中,无论何时发出'error'事件并且没有人收听它,它都会抛出.为了使它不被抛出,请在其上放置一个监听器并自己处理它.这样,您可以使用更多信息记录错误.

要为一组调用创建一个侦听器,您可以使用 并在运行时捕获其他错误.确保与http(服务器/客户端)相关的每个异步操作与代码的其他部分相比处于不同的上下文中,域将自动侦听error事件并将其传播到自己的处理程序.所以你只听那个处理程序并获取错误数据.您还可以免费获得更多信息.(域名被剥夺了).

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

  • 警告:节点域当前 [已弃用](https://nodejs.org/api/domain.html)。 (2认同)

Mik*_*ike 14

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


fwo*_*fel 11

除了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);
});
Run Code Online (Sandbox Code Playgroud)

当我有这个"套接字挂断"错误时,这是​​因为我没有捕获请求错误.

  • 回调函数中应该包含什么?我是在服务器上定义它还是在响应中提供它? (2认同)