如何避免nodejs循环上的429

Posted

技术标签:

【中文标题】如何避免nodejs循环上的429【英文标题】:How to avoid 429 on nodejs loop 【发布时间】:2021-07-23 16:47:48 【问题描述】:

在 NODEJS 上工作。需要从 API 收集数据,执行 API 需要 Id 并响应结果。

const companies=[1,2,3,4,5,....1000];

    for (let company of companies) 
       letdata =axios.get("API url"+company);
    

上面的代码运行完美,但一段时间后显示错误“Request failed with status code 429”

【问题讨论】:

429: Too Many Requests 如果它是您的 api,则实现单个公司查找或多个(发布数组) @Lawrence Cherone,是第三方API,他们没有批处理服务,需要一个一个去获取。 你的例子没有意义。 axios.get 返回一个承诺。承诺没有 data 属性。 letdata =axios.get("API url"+company); 不起作用。 【参考方案1】:

使用async / await

您实际上向服务器发出了 1000 个并发请求。 axios 是异步的,因此返回一个承诺。这意味着它将发起请求,但不会“等待”(或阻止执行)服务器回答。

为避免 429“请求过多”错误,您可以在其他解决方案中等待一个请求完成,然后再启动下一个请求。您的代码可能如下所示:

(async ()=> 
    const companies=[1,2,3,4,5,....1000];

    for (let company of companies) 
       letdata = await axios.get("API url"+company);
    
)();

其他说明:

从承诺中解构data(在您的原始代码中)可能不正确。 具有async 函数的性质,当在没有await 的情况下(例如从常规函数)调用时,它将return 在第一个await 上作出承诺,并在数据到达时继续执行。李>

【讨论】:

应用第一种方法后, (async ()=> )(); 下没有执行任何操作什么都不执行

以上是关于如何避免nodejs循环上的429的主要内容,如果未能解决你的问题,请参考以下文章

小痴Nodejs升级路---事件循环eventloop

js循环点击div事件

nodejs 事件循环

在nodejs中事件循环分析

循环执行 Node JS 中的 fetch 操作

如何在js中循环赋值给页面上的li附上标签?