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

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

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

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

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

【问题讨论】:

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

标签: javascript node.js http promise axios


【解决方案1】:

使用async / await

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

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

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

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

其他说明:

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

【讨论】:

  • 应用第一种方法后, (async ()=> {})(); 下没有执行任何操作什么都不执行
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多