You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:32:38