Node.js循环调用API引发内存过载问题求助
解决API循环调用导致的内存暴涨问题
哇,你遇到的这个内存暴涨问题其实是典型的同步循环+异步请求搭配错误导致的,咱们先拆解问题根源,再给你修复后的代码方案:
问题根源分析
同步while循环疯狂发起异步请求
你的loop函数里用了while (infinity < 1),这个条件永远为true(因为infinity初始是0,全程没修改)。而且api_call是异步函数(依赖axios的Promise),同步while根本不会等请求完成,会瞬间发起成千上万的API请求——每个请求都会占用内存,直接把内存撑爆,连垃圾回收(GC)都赶不上清理,最后就报了内存分配失败的错误。api_call函数没有返回有效结果
你现在的api_call里调用了axios.get,但没有return这个Promise,所以函数默认返回undefined。后面if (api_call(variable) > true)完全是无效判断(undefined > true永远是false),循环永远不会break,只会一直疯跑。模板字符串语法错误
let url = 'http://api.site.com/api.php?i=${api[item].appid}';这里用了单引号,模板字符串必须用反引号`,不然${}不会被解析,请求的url里还是原样的变量占位符,请求本身就不对。
修复后的代码方案
我们用async/await实现异步循环,确保每次请求完成后再发起下一次,不会疯狂堆积请求:
const axios = require('axios'); const api = require('./api.json'); // 修复API调用函数:返回Promise,正确处理请求和结果 async function apiCall(item) { try { // 用反引号解析模板字符串,正确拼接url const url = `http://api.site.com/api.php?i=${api[item].appid}`; const response = await axios.get(url); const id = response.data.id; // 返回判断结果:是否达到目标值 return id > 10; } catch (error) { console.error('API请求出错:', error); // 请求失败时返回false,也可以根据需求添加重试逻辑 return false; } } // 异步监控循环:每次等待请求完成后再判断 async function monitorItem(variable) { while (true) { const isTargetReached = await apiCall(variable); if (isTargetReached) { console.log('Found!'); break; } console.log('-'); // 可选:添加延迟,避免太频繁请求被API限流 await new Promise(resolve => setTimeout(resolve, 1000)); } } // 调用监控函数,传入你要监控的item键名 monitorItem('your-item-key');
关键改进点
- 把
api_call改成async函数,用await等待axios请求完成,确保返回有效Promise结果。 - 用异步
while (true)循环配合await,保证每次API请求完成后再进行下一次循环,不会瞬间发起大量请求占用内存。 - 修复了模板字符串的语法错误,确保url正确拼接。
- 增加了可选的请求延迟,避免过于频繁请求导致被API服务器限流。
- 完善了错误处理,请求出错时会打印错误信息,不会让程序直接崩溃。
额外建议
- 避免用
infinity这种容易混淆的变量名,用语义化命名更易读。 - 可以增加最大重试次数,防止API一直返回错误或目标值永远达不到时的无限循环。
- 如果需要监控多个item,可控制并发数(比如用
p-limit库),避免同时发起太多请求。
内容的提问来源于stack exchange,提问作者Charlie Simon
相关产品推荐
相关产品推荐

