如何在 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 请求的主要内容,如果未能解决你的问题,请参考以下文章
使用 Axios 在 Node.js 中克服 Pending Promise 并完成构建 JSON