【问题标题】:Node.js REQUEST throwing ECONNREFUSED after a few attempts几次尝试后,Node.js REQUEST 抛出 ECONNREFUSED
【发布时间】:2019-06-19 06:31:38
【问题描述】:

我正在使用以下代码:

async function validateMOData(data, callback) {
    success('Validation started');
    let a = 0;
    let i = data.length;
    console.log('length of array', i);
    while (i--) {
        a = a + 1;
        console.log('Loop Count', a);
        console.log(data[i]);
        let result;
        try {
            result = await checkValidity(data[i]);
            if ((JSON.parse(result.body)).isValid === false) {
                createErrorLog(data[i].MemberId, data[i].MemberAgreementId, (JSON.parse(result.body)).responseMessage, (JSON.parse(result.body)).responseCode, 'x', data[i].CsvFileName)
                deleteFaultyData(data[i].Id);
                data.splice(i, 1);
            }
        } catch (err) {
            console.log(err);
        }
    }
    success('validation ended');
    callback(data);
}
function checkValidity(record) {
    return new Promise((resolve, reject) => {
        let validityCheckUrl = `${constants.USER_INTERFACE.SERVER_URL_PREFIX}validateMemberData/?memberId=${record.MemberId}&memberAgreementId=${record.MemberAgreementId}`;
        request({ url: validityCheckUrl, pool: { maxSockets: 10 } }, (error, response, body) => {
            if (error) {
                reject(error);
            } else {
                resolve(response, body);
            }
        });
    });

}

在 while 循环中进行几次迭代后,checkValidity 方法开始抛出以下错误:

{ Error: connect ECONNREFUSED IP:port
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: 'IP',
port: port }

此错误不是在第一次请求中出现,而是在几次请求后出现。任何人都可以帮忙吗?我错过了什么吗?

注意:此代码在 AWS lambda 上运行,checkValidity 连接到部署在 EC2 上的 Node.js 服务器

【问题讨论】:

  • 你正在查看的数组的长度是多少;在失败之前处理了多少请求?
  • 10 到 15 得到处理。总长度为 100
  • 可以添加时间信息吗?您每秒发送多少个请求?

标签: node.js amazon-ec2 aws-lambda requestjs


【解决方案1】:

我认为你没有放置检查以检查 i 是否为负数,或者简单来说这里没有中断条件尝试

try {
      ***********************
        result = await checkValidity(data[i]);
        if ((JSON.parse(result.body)).isValid === false) {
            createErrorLog(data[i].MemberId, data[i].MemberAgreementId, (JSON.parse(result.body)).responseMessage, (JSON.parse(result.body)).responseCode, 'x', data[i].CsvFileName)
            deleteFaultyData(data[i].Id);
            data.splice(i, 1);
        }
    } catch (err) {
        console.log(err);
    }

所以循环会尝试在 checkvalidity 内发送甚至不存在的数据,所以很可能它正在发送错误

【讨论】:

  • 数据存在,但无法获取有效数据。与连接被拒绝有关,与无效数据无关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多