Firebase RangeError: Maximum call stack size exceeded

Firebase RangeError: Maximum call stack size exceeded

下面是来自 问题的 firebase 读取查询性能测试,我只是将其更改为我自己的 firebase 实例并删除了顺序测试,只留下并行测试。

问题是,每当我 运行 这段代码并使 for 循环 i < 12 产生一个长度数组:32,768 时,我总是收到一个错误提示超出调用堆栈:RangeError: Maximum call stack size exceeded 但我无法弄清楚是什么导致了此错误...我尝试在本地主机上和通过云函数对其进行测试但没有成功。

(引用的 SO 测试在 i<12 时有效,但如果我将其更改为 13 也会中断).

function loadVideosParallel(videoIds, callback) {
  Promise.all(
    videoIds.map((id) => {
      return admin.database().ref("test").child(id).once('value')
        .then((snapshot) => {
          return snapshot;
        })
    })
  ).then((r) => callback());
}

function loadVideosForUser(loadVideosParallel, callback) {
  admin.database().ref("test").once('value').then((snapshot) => {
    var videoKeys = Object.keys(snapshot.val());

    for (var i=0; i < 13; i++) {
      videoKeys = videoKeys.concat(videoKeys);
    }

    loadVideosParallel(videoKeys, function() {
      if (callback) callback();
    });
  })
}

let start = Date.now();
loadVideosForUser(loadVideosParallel, function() {
  const endTime = (Date.now() - start)+'ms';
  console.log('parallel done after '+ endTime +'ms');
});

2017-12-20T23:26:28.527Z E helloWorld: RangeError: Maximum call stack size exceeded at T (/user_code/node_modules/firebase-admin/lib/database/database.js:139:366) at /user_code/node_modules/firebase-admin/lib/database/database.js:190:120 at ta (/user_code/node_modules/firebase-admin/lib/database/database.js:45:40) at ua (/user_code/node_modules/firebase-admin/lib/database/database.js:45:89) at Ag (/user_code/node_modules/firebase-admin/lib/database/database.js:190:93) at /user_code/node_modules/firebase-admin/lib/database/database.js:195:260 at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:363) at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:449) at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:449) at Nc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:316) 2017-12-20T23:26:29.758741829Z D helloWorld: Function execution took 5107 ms, finished with status: 'crash'

有人有什么见解吗?我试着查看 /user_code/node_modules/firebase-admin/lib/database/database.js 文件,但它被缩小了,所以无法真正判断发生了什么。

您正在排队超过 32,768 个读取操作,这使 SDK 中的堆栈之一溢出。在您的代码中加载那么多项目而没有任何流控制似乎是一个 糟糕 的想法,所以我真的很高兴 SDK 能够解决问题。考虑分批加载更合理的项目。

但总的来说:尝试限制从数据库加载数千个项目。如果聚合操作需要那么多项目,那么 much 最好将聚合值显式保存在数据库中并在每次写入操作时更新它。