【问题标题】:Node.js socket hang up with http.get but not with request moduleNode.js 套接字挂断了 http.get 但不是请求模块
【发布时间】:2019-03-06 06:44:41
【问题描述】:

我正在 AWS lambda 中执行一些 http 调用。通话次数约为每分钟 400 次。 调用执行如下 sn-p

var req = http.get("https://www.google.com", res => {
    let body = '';
    res.on('data', chunk => {
        body += chunk;
    });
    res.on('end', chunk => {
        if (body.includes('html')) {
            console.log('Got back healthy response');
        } else {
            console.log('Got an unexpected response');
        }
    })
});
req.on('error', e => {
    console.log('Got an error response');
})

这是一个简单的 https 请求。调用 Lambda 时,它会在一次执行中执行约 40 个请求。 我的问题是,一开始,一切看起来都很好,并且所有请求都正确执行。一段时间后(可能是大约 30 分钟后)调用开始降级,我返回“socket hang up ECONNRESET”错误。

然后我尝试使用请求模块并使用以下代码更改代码

const request = require('request');
request("https://www.google.com", function (error, response, body) {
  if (!error && response.statusCode == 200 && body.includes('html')) {
    console.log('Got back healthy response' );
  } else {
    console.log('Got an unexpected response');
    console.log('Error: ' + error);
    console.log('Response: ' + response);
    console.log('Body: ' + body);
  }
});

在这种情况下,在同一个 lambda 中具有相同数量的请求,相同的设置我 从不 得到 ECONNRESET 错误。 我可以使用请求模块,但我很想知道为什么默认的http 实现会发生这种情况。 这是由request 模块以更合适的方式处理的套接字分配引起的吗?

我知道已经有人问过类似的问题,但我没有为我的案例找到一个好的答案。

【问题讨论】:

    标签: node.js aws-lambda node-modules


    【解决方案1】:

    这不是一个真正的答案,但我不会写 cmets。

    我能看到的主要区别是编码。请求中的默认编码是utf8,而在http 模块中则是buffer。添加res.setEncoding('utf8'); 可能会有所帮助。它可能不会更快。在body += chunk 行中,您只是将 Buffer 隐式转换为字符串,因此它应该是相同的。

    如果添加 setEncoding 不会改变任何内容,那么您可能需要向 nodejs 团队报告问题,因为它与 http_http_get_url_options_callback 中的示例相同。他们应该修复它或更改示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2019-03-23
      • 2014-12-25
      • 2012-03-24
      • 1970-01-01
      • 2013-11-16
      • 2018-02-24
      相关资源
      最近更新 更多