在Node.js中如何使用axios循环发起批量HTTP请求
问题根因
- 现有代码中for循环内的
await会强制等待当前IP查询请求完成后,才会发起下一个用户的请求,所有请求完全串行执行,总耗时为所有单个请求耗时的累加,这就是总耗时达到10秒的核心原因 - 不使用
await拿不到结果是因为异步请求还未完成,函数就已经提前返回了用户数组,此时countryCode字段还未被赋值
优化方案
将串行请求改为并行请求,利用Promise.all批量等待所有异步请求完成,总耗时仅等于最慢的单个请求耗时,可大幅降低整体执行时间。优化后代码如下:
async function getAllusers() { let allUsersData = await usersDao.getAllusers(); // 构造所有IP查询请求的Promise数组,并行发起所有请求 const requestTasks = allUsersData.map(async (user, index) => { const data = { ip: user.ip }; const body = new URLSearchParams(data); try { const res = await axios.post("http://myAPI", body); allUsersData[index].countryCode = res.data.countryCode; } catch (err) { // 单个请求失败时可设置默认值,避免单个异常导致整个函数报错 allUsersData[index].countryCode = 'UNKNOWN'; console.error(`查询IP ${user.ip} 归属地失败:`, err); } }); // 等待所有请求全部执行完成 await Promise.all(requestTasks); return allUsersData; }
额外注意事项
- 如果查询接口有并发请求数限制,可以做分批并发控制,比如每批同时发起5-10个请求,处理完一批再发起下一批,避免触发接口限流规则
- 建议不要混用
await和.then写法,统一用await处理异步逻辑可读性更高 - 如果用户量非常大,建议优先考虑IP归属地本地查询库,相比调用远程接口性能会提升多个数量级
内容的提问来源于stack exchange,提问作者Y F
相关产品推荐
相关产品推荐

