如何执行 30k 连续 API 调用(节点)[错误:连接 ECONNRESET]

Posted

技术标签:

【中文标题】如何执行 30k 连续 API 调用(节点)[错误:连接 ECONNRESET]【英文标题】:How to perform 30k sequential API calls (node) [ERROR: connect ECONNRESET] 【发布时间】:2021-03-02 17:33:12 【问题描述】:

我的问题是我必须从 CSV 文件中提取数据,向 mysql 数据库发出 GET 请求(通过环回),并根据答案发出 Post 请求或不更新实例。

CSV 文件的导入工作正常,当我开始循环它并进行 API 调用时,所有的 GET 请求都是一个接一个地发出,而没有解决任何一个。

性能不是问题,因为它是一个只需要运行一次的导入器。所以我想我正在考虑的行为是一个队列:

    CSV 中的条目位于对象数组中 一次取一个对象 发出 GET 请求 等待回复 发出帖子请求 等待回复 从数组中取出下一个对象

这是最简单的方法吗?如果是这样,如何实现这种顺序行为?

我是后端开发的新手,所以这让我很困惑。

这是我的代码:

编辑

我现在正在使用 axios,但是我仍然收到错误:

ERROR: connect ECONNRESET 127.0.0.1:1338

当有很多并行获取请求时会出现该错误。我该如何解决这个问题?

const createSan = () => 

    const data = fs.readFileSync(path.join(__dirname, '..', 'dist', 'test_mid.csv'),  encoding: 'utf8' );

    var options = 
        delimiter: ';', // optional
        quote: '"' // optional
    ;

    const json = csvjson.toObject(data, options);

    json.forEach(item => 

    

        if (item['BDBNR'].length > 0) 

            let sanNr;
            let sanPartOne;
            let sanPartTwo;
            let sanPartThree;

            if (item['BDB_SORTENTEXT_NR'].length === 5) 
                sanPartOne = (item['BDB_SORTENTEXT_NR']);
             else 
                failedCount++;
                return new Error('BDB_SORTENTEXT_NR incorrect');
            
            if (item['SAN_MITTE'].length === 12) 
                sanPartTwo = item['SAN_MITTE'];
             else if (item['SAN_MITTE'].length === 0) 
                sanPartTwo = '000000000000';
             else 
                failedCount++;
                return new Error('SAN_Mitte incorrent');
            
            if (item['SAN_ENDE'].length === 12) 
                sanPartThree = item['SAN_ENDE'];
             else if (item['SAN_ENDE'].length !== 12) 
                sanPartThree = item['SAN_ENDE'];
                for (let i = sanPartThree.length; i < 12; i++) 
                    sanPartThree = '0'.concat(sanPartThree);
                
            

            sanNr = sanPartOne + sanPartTwo + sanPartThree;


            if (sanNr.length !== 29) 
                failedCount++;
                return new Error('SAN Nummer incorrect');
            


            const getData = async () => 
                try 
                    const res = await axios.get(`http://localhost:1338/api/articles?filter="where":"bdbnr":"$item['BDBNR']"`)
                    postCall(res.data);
                 catch(err) 
                    console.log(err)
                
            

            getData();

            const postCall = data => 
                if (data.totalRowCount > 0 && data.rows[0]) 


                    if (data.rows[0].bdbnr.length > 0) 
                        data.rows[0].bdbnr = sanNr;
                        data.rows[0].tstamp = 1;
                        data.rows[0].crdate = 1;
                        data = data.rows[0];

                        const postData = async() => 
                            try 
                                console.log('fired')
                                const res = await axios.post(`http://localhost:1338/api/articles/$data.id/replace`, data)
                                 .then(res => 
                                     console.log(`Status: $res.status`);
                                     console.log('Body: ', res.data);
                            )
                         catch(err) 
                                console.log(err)
                            
                        

                        postData();
                    
                
            


        


    )



createSan();

非常感谢帮助

【问题讨论】:

您不能一次加载整个文件。看看流(例如***.com/a/50487888/4480179)。另外,imports 应该在文件的顶部,不要把 require('http') 放在map 循环中 感谢您的评论。抱歉,也许我没有说清楚,CSV 的导入工作正常,问题是 API 调用(它一个接一个地运行所有 GET 请求,没有解决任何问题)。 CSV 文件的流可以帮助我吗? 【参考方案1】:

在for循环中开始使用asyncawait,你会得到一个一个下载文件的队列。至于下载本身 - 使用 Axios 是为了方便,因为它是基于 Promise 的,并且可以轻松用于此类任务。

【讨论】:

以上是关于如何执行 30k 连续 API 调用(节点)[错误:连接 ECONNRESET]的主要内容,如果未能解决你的问题,请参考以下文章

Neo4J与NeoModel:如何加速图形创建?

如何在 angular2 中进行连续的 http api 调用?

API调用在ReactJS中得到CORS错误,但在节点和邮递员中得到响应

如何在错误 Spring WebFlux 上调用另一个 api

如何在nodejs里调用执行系统命令

节点jS ETIMEDOUT当调用api时