Node.js Firebase RangeError:超过最大调用堆栈大小
下面是一个来自question的firebase读取查询性能测试,我刚刚将其更改为我自己的firebase实例,并删除了顺序测试,只留下并行测试 问题是,每当我运行这段代码并执行for循环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
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');
});