使用 fetch 在节点中进行异步 api 调用的最佳实践?

Posted

技术标签:

【中文标题】使用 fetch 在节点中进行异步 api 调用的最佳实践?【英文标题】:Best practice for making async api calls in node using fetch? 【发布时间】:2020-08-19 12:15:30 【问题描述】:

我正在 nodeJS、express 和 mysql 中构建一个应用程序,在其中我使用 node fetch 从几个不同的 API 收集数据,其中一个限制为每 5 分钟 200 次调用。 为了完全更新我的数据库,我基本上需要不间断地运行对这个 API 的调用, 目前我正试图通过在 for 循环/foreach 中使用睡眠来保持在限制范围内。

问题是每个请求都可能随时间变化,看起来我可以使调用更有效,而不是为每个请求不断休眠相同的时间。我想知道是否有更好的方法来做到这一点?我一直在考虑让例如 199 个调用异步,然后正好等待 5 分钟,然后重复它..但我不知道如何。

找不到关于此的主题,但如果已经有好的答案,请做一个链接。 非常感谢您的回答,如果您有其他反馈,请告诉我!

  for (let i = 1; i < length; i++) 
    try 
      let id = IdCollection[i];
      let resultFromApiCall = await datafetcher.MakeApiCall(id);

      await sleep(2000);

     catch (error) 
      console.log("Error in api-calls" + error);
    
  ```

【问题讨论】:

我认为最佳解决方案取决于您在此处获取的内容。我不知道每个fetch 之间是否需要延迟,因为我不知道你在获取什么。 如果你绝对需要发出这么多请求,也许你应该研究一下 WebSockets (html5rocks.com/en/tutorials/eventsource/basics) 【参考方案1】:

我认为这是一个品味问题。

我会立即发出所有允许的请求,然后等到 5 分钟间隔结束。

  // constants to define the restrictions
  const restrictionCalls = 5;
  const restrictionTime = 300000; // 5 * 60 * 1000

  let throttleTimer = Date.now(); // when did we start this interval?
  let throttleCounter = 0; // how many calls did we make in this interval?

  for (let i = 1; i < length; i++) 
    try 
      let id = IdCollection[i];
      throttleCounter++;
      let resultFromApiCall = await datafetcher.MakeApiCall(id);
     catch (error) 
      console.log("Error in api-calls" + error);
    

    if(throttleCounter === restrictionCalls) 
      const timePassed = Date.now() - throttleTimer;
      const waitTime = restrictionTime - timePassed;
      if(waitTime > 0) await sleep(waitTime);

      // reset
      throttleTimer = Date.now();
      throttleCounter = 0;
    
  

【讨论】:

谢谢!尝试一下,它似乎与一些小的调整效果很好。太棒了:)

以上是关于使用 fetch 在节点中进行异步 api 调用的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 asyncio 和 aiohttp 异步通过 api 响应进行分页

fetch网络请求 get 和 post

如何在带有 Jest 的 react-native 中使用模拟的 fetch() 对 API 调用进行单元测试

将 fetch api 与 ramda 一起使用

如何在 api 调用中使用异步等待获取在反应本机中通过基本身份验证

Fetch在等待很长时间时给出空响应