Node.js Firebase RangeError:超过最大调用堆栈大小

Node.js Firebase RangeError:超过最大调用堆栈大小,node.js,firebase,firebase-realtime-database,firebase-admin,Node.js,Firebase,Firebase Realtime Database,Firebase Admin,下面是一个来自question的firebase读取查询性能测试,我刚刚将其更改为我自己的firebase实例,并删除了顺序测试,只留下并行测试 问题是,每当我运行这段代码并执行for循环I{ 返回快照; }) }) )。然后((r)=>callback()); } 函数loadVideosForUser(loadVideosParallel,回调){ admin.database().ref(“test”)。一次('value')。然后((快照)=>{ var videoKeys=Object

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

问题是,每当我运行这段代码并执行for循环
I<12
时,就会产生一个长度数组:
32768
,我总是收到一个错误,说调用堆栈超过了:
RangeError:超过了最大调用堆栈大小
,但我无法找出导致此错误的原因。。。我尝试在本地主机和云功能上测试它,但没有成功

(参考SO测试在i{ 返回admin.database().ref(“test”).child(id).once('value')) 。然后((快照)=>{ 返回快照; }) }) )。然后((r)=>callback()); } 函数loadVideosForUser(loadVideosParallel,回调){ admin.database().ref(“test”)。一次('value')。然后((快照)=>{ var videoKeys=Object.keys(snapshot.val()); 对于(变量i=0;i<13;i++){ videoKeys=videoKeys.concat(videoKeys); } loadVideosParallel(视频键,函数(){ if(callback)callback(); }); }) } 让我们开始=Date.now(); LoadVideosFruser(loadVideosParallel,函数(){ const endTime=(Date.now()-start)+'ms'; log('在'+endTime+'ms'之后并行完成'); }); 2017-12-20T23:26:28.527Z E helloWorld:RangeError:最大调用堆栈 超出尺寸 at T(/user\u code/node\u modules/firebase admin/lib/database/database.js:139:366) at/user\u code/node\u modules/firebase admin/lib/database/database.js:190:120 在ta(/user\u code/node\u modules/firebase admin/lib/database/database.js:45:40) 在ua(/user\u code/node\u modules/firebase admin/lib/database/database.js:45:89) 在Ag(/user\u code/node\u modules/firebase admin/lib/database/database.js:190:93) at/user\u code/node\u modules/firebase admin/lib/database/database.js:195:260 在Oc(/user\u code/node\u modules/firebase admin/lib/database/database.js:85:363) 在Oc(/user\u code/node\u modules/firebase admin/lib/database/database.js:85:449) 在Oc(/user\u code/node\u modules/firebase admin/lib/database/database.js:85:449) 在Nc(/user\u code/node\u modules/firebase admin/lib/database/database.js:85:316) 2017-12-20T23:26:29.758741829Z D helloWorld:函数执行已完成 5107毫秒,完成状态:“崩溃”


有人有什么见解吗?我试着查看
/user\u code/node\u modules/firebase admin/lib/database/database.js
文件,但它被缩小了,因此无法真正判断发生了什么。

您正在排队等待超过32768个读取操作,这会溢出SDK中的一个堆栈。在代码中加载这么多没有任何流控制的项似乎是个坏主意,所以我很高兴SDK成功了。考虑以更合理的批次加载项目。
但一般来说:尽量限制从数据库加载数千项。如果聚合操作需要这么多项,最好将聚合值显式保留在数据库中,并在每次写入操作时更新它。

如果您想查看未模糊的代码:在提问之前我查看了那里,但是那里的database/database.ts文件不一样,它要短得多。谢谢你的回答,但是为什么32768读取操作在剥离了顺序部分并只测试了并行部分之后,在参考测试中起作用呢?但是,如果我将其复制到本地主机或我自己的云功能上,它就不再工作了?测试背后的动机是,我试图看看对于活动提要,读时扇出与写时扇出会有什么不同
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');
});