【问题标题】:Azure function app ETIMEDOUT error works sometimes but not othersAzure 函数应用程序 ETIMEDOUT 错误有时有效,但有时无效
【发布时间】:2020-02-18 19:13:08
【问题描述】:

我有以下代码:

var request = require('request');
var rp = require('request-promise');
module.exports = async function(context, req) {
    var arr = [[url1],[url2]]
    for (i = 0; i < arr.length; i++) {
        func(context, arr[i]);
    }
}
function func(context, urls) {
    const promises = urls.map(item => {
        return rp({
            uri: item,
            simple: false,
            resolveWithFullResponse: true
        }).then(response => {
            if (response.statusCode == 403) {

                var msg = "hello";
                return msg;
            } else {
                return null;
            }
        });
    });

    return Promise.all(promises).then(data => {
        // remove null results from array
        return data.filter(item => item !== null);
    });
}

而且我不断收到此错误。有时有效,有时无效。我该如何解决这个问题,为什么它有时会起作用,有时会不起作用。

Result: Failure
Exception: RequestError: Error: connect ETIMEDOUT 

我需要包含pool 选项吗?或者是timeout?错误似乎是由于arr 的大小造成的。

【问题讨论】:

  • 现在有更新吗?如果它对你有帮助,你可以接受它作为答案。
  • 我用agent: false, pool: { maxSockets: 8 }解决了这个问题
  • 我在回复中更新了它。您可以接受它作为答案,或者您发布另一个回复以让其他人知道并关闭此问题。
  • 完成了,谢谢。您能解释一下为什么代理/套接字解决方案有效,以便我进一步理解吗?

标签: node.js azure request-promise azure-function-app


【解决方案1】:

这是网络级别的问题,很可能与您的代理配置有关。当使用没有有效证书的https(端口 443)向服务器请求时,您也可能会收到此错误。因此,使用以下配置可以解决您的问题。

return rp({
       uri: item,
       simple: false,
       resolveWithFullResponse: true,
       proxy: 'http://<your.proxy.info>:8080',
       strictSSL :false
})

更新:

没有代理,没有流式传输,只有一个请求会启动多个异步请求,设置此选项:

agent: false, pool: {maxSockets: 8} 

【讨论】:

  • 感谢您的回复。我在哪里可以找到我的代理信息来尝试这个?
  • 当没有有效的证书时,您可以通过编辑 /etc/hosts(或 Windows 上的主机)添加带有 IP 地址和主机公用名的记录来确认此行为(您可以获得检查内部证书),然后再次提出请求。
  • 使用proxy:'http://username:password@host:port'。有关更多信息,请参阅此article
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多