如何在 node.js 中使用 axios 循环许多 http 请求

Posted

技术标签:

【中文标题】如何在 node.js 中使用 axios 循环许多 http 请求【英文标题】:How to loop many http requests with axios in node.js 【发布时间】:2022-01-05 07:54:59 【问题描述】:

我有一个用户数组,每个用户都有一个 IP 地址。

我有一个 API,我将 IP 作为请求发送,它返回属于该 IP 的县代码。

为了获得每个用户的国家代码,我需要向每个用户发送单独的请求。

在我的代码中,我执行了异步等待,但大约需要 10 秒才能获得所有响应,如果我不执行异步等待,则根本无法获得国家代码。 我的代码:

async function getAllusers() 
  let allUsersData = await usersDao.getAllusers();

  for (let i = 0; i < allUsersData.length; i++) 
    let data =  ip: allUsersData[i].ip ;
    let body = new URLSearchParams(data);
    await axios
      .post("http://myAPI", body)
      .then((res) => 
        allUsersData[i].countryCode = res.data.countryCode;
      );
  

  return allUsersData;

【问题讨论】:

那么,您到底在寻求什么帮助?听起来您在使用await 时确实获得了代码。 allUsersData 数组中有多少项? 问题是,如果我使用 await 它会花费太多时间来处理所有响应(大约 10 秒),这是因为它在我有大约 40 个用户的每个请求后等待响应跨度> 【参考方案1】:

如果您只是想更快地获得所有结果,您可以并行请求它们并知道它们何时全部完成Promise.all()

async function getAllusers() 
  let allUsersData = await usersDao.getAllusers();

  await Promise.all(allUsersData.map((userData, index) => 
      let body = new URLSearchParams(ip: userData.ip);
      return axios.post("http://myAPI", body).then((res) => 
          allUsersData[index].countryCode = res.data.countryCode;
      );
  ));
  return allUsersData;

注意,如果allUsersData 数组很大(比如超过 20 个),我不建议这样做,因为你会在目标服务器上大量请求,它可能会阻碍其性能或您可能会得到限价甚至拒绝服务。在这种情况下,您需要使用 pMap() here 或 mapConcurrent() here 这样的代码一次发送 N 个请求(可能是 5 个)。

【讨论】:

谢谢!很有帮助 我想...但我是堆栈溢出的新手...而且我没有足够的声誉。 @YF - 你总是有足够的声望来点击你自己问题的答案上的复选标记。向上/向下箭头需要声望,但复选标记不需要声望。 你说得对,谢谢。【参考方案2】:

您可以使用Promise.all 一次性提出所有请求,而不是一一提出。

let requests = [];
for (let i = 0; i < allUsersData.length; i++) 
    let data =  ip: allUsersData[i].ip ;
    let body = new URLSearchParams(data);
    requests.push(axios.post("http://myAPI", body)); // axios.post returns a Promise
  
try 
    const results = await Promise.all(requests);
    // results now contains each request result in the same order
    // Your logic here...

catch (e) 
    // Handles errors

【讨论】:

以上是关于如何在 node.js 中使用 axios 循环许多 http 请求的主要内容,如果未能解决你的问题,请参考以下文章

在 Node.js 中使用 axios 发布表单数据

在 Node.js 中允许 CORS 用于 PUT

使用 Axios 在 Node.js 中克服 Pending Promise 并完成构建 JSON

反应 js:axios 向 node.js api 发布请求

如何在颤动中允许浮动通知和锁定屏幕通知编程

使用 AXIOS (Node.js) 在请求之间保留 cookie