使用Google Drive API分页取文件时Do While循环引发内存溢出致命错误
解决Google Drive API分页获取文件时的JavaScript堆内存溢出问题
问题原因分析
你碰到的这个堆内存溢出错误,核心问题出在同步循环和异步API请求的不兼容上。
drive.files.list是基于回调的异步操作,但你用了同步的do...while循环——它完全不会等当前API请求完成、回调执行,就会立刻发起下一轮请求。短时间内会堆积大量未完成的HTTP请求、回调函数和临时数据,直接把JavaScript的堆内存撑爆,最后就触发了崩溃。
修正方案:改用Async/Await实现异步循环
把代码改成基于async/await的异步循环,让每一轮请求彻底完成后再发起下一轮,避免同时产生大量异步任务占用内存。
修正后的代码:
async function listFiles(auth) { const drive = google.drive({ version: "v3", auth }); let pageToken = null; do { try { // 用await等待API请求完成,替代回调逻辑 const res = await drive.files.list({ pageSize: 10, q: "'root' in parents and trashed=false", fields: "nextPageToken, files(id, name)", pageToken: pageToken, }); pageToken = res.data.nextPageToken; const files = res.data.files; if (files.length) { files.forEach((file) => { console.log(`${file.name} (${file.id})`); }); } else { console.log("No files found!"); } } catch (err) { console.error(`The API returned an error: ${err}`); // 可选:遇到错误时可以选择终止循环,避免无限重试 break; } } while (pageToken); // 当nextPageToken为undefined时,自动终止循环 }
关键改动说明
- 把
listFiles声明为async函数,这样才能在内部使用await关键字 - 用
await替代回调函数,强制循环等待当前API请求完成后再继续 - 用
try/catch捕获API请求的错误,替代回调里的错误处理逻辑 - 循环条件简化为
while (pageToken),因为当没有更多文件时nextPageToken会变成undefined,循环会自动终止
额外优化建议
- 如果你的文件数量特别多,可以适当调大
pageSize(比如100),减少总请求次数,但不要设置得过大(避免单次响应数据量超标) - 如果需要处理超大量文件,可以在每轮循环后手动清理不再需要的变量,帮助V8引擎更快回收内存
内容的提问来源于stack exchange,提问作者Ayan
相关产品推荐
相关产品推荐

