【问题标题】:How to track down error in node network code?如何追踪节点网络代码中的错误?
【发布时间】:2019-06-12 00:12:02
【问题描述】:

我正在尝试找出为什么我的代码因此错误而失败:

 { Error: connect ECONNREFUSED 127.0.0.1:443
     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1082:14)
   errno: 'ECONNREFUSED',
   code: 'ECONNREFUSED',
   syscall: 'connect',
   address: '127.0.0.1',
   port: 443 }

该错误的堆栈跟踪如下所示:

 Error: connect ECONNREFUSED 127.0.0.1:443
     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1082:14)

我正在建立网络连接,但我没有尝试连接到 localhost。

我使用的网络代码在其他情况下也能正常工作(并连接到正确的主机)。

我使用的是 brew install 提供的节点 11.6.0,看起来 brew “Cellar” 目录结构中唯一出现的字符串“net.js” 是节点二进制文件本身。换句话说,即使在

 brew install --build-from-source node

运行

 find /usr/local/Cellar/node/11.6.0 -type f | xargs fgrep -l net.js

只找到一个文件:/usr/local/Cellar/node/11.6.0/bin/node 并且该目录树中没有 net.* 文件。

如果重要的话,我的似乎触发此错误的代码如下所示:

  const get_json_with_auth= async (channel, url) => {
    const parsed_url= URL.parse(url);
   return new Promise((good, fail) => {
     let request= require('https').get({
       hostname: parsed_url.hostname,
       path: parsed_url.path,
       headers: {
         Authorization: get_auth('GET', channel, url)
       }
     });
     console.log('url', url);
     request.on('response', response=> {
       const chunks= [];
       response.on('data', data=> chunks.push(data));
       response.on('end', ()=> good(JSON.parse(Buffer.concat(chunks).toString())));
     });
     request.on('error', err=> fail(err));
   });
 };

(我在 OSX high sierra 上。)

但是,再一次,我使用的 url 中的主机名无法解析为 localhost(并且在其他情况下也可以正常工作)。

如何隔离这样的问题?

【问题讨论】:

    标签: node.js debugging https


    【解决方案1】:

    使用环境变量 NODE_DEBUG='net,tls,http,https' 运行我的代码为我提供了足够的信息来识别(并隔离)问题。

    【讨论】:

    • 还有什么问题?我正在处理同样的问题。
    • 就我而言,问题是一个错字,我认为我正在生成的请求与我正在生成的请求不同。一旦我看到了请求的实际内容,我就知道该去哪里解决这个问题了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多