参考有关如何处理大量查询的答案large number of promises,我使用“ lodash”库对查询进行了重新分组,该库适用于少量查询,但是firebase返回错误>
@ firebase / database:防火墙警告:用户回调引发了异常。 RangeError:超出了最大调用堆栈大小
我知道这意味着数组已经变得太大了,但是,当我尝试使用10 ms计时器运行纯Javascript Promises时,该代码似乎最多容纳1,000,000,如该答案所示。我不确定这是firebase还是node.js问题,但是鉴于Firebase实时数据库可以在JSON树中存储数百万条记录,因此必须有更好的方法来处理这么多的Promise。我在很大程度上基于这三个问题的方法,这是原始问题Find element nodes contained in another node,这种用于检查数据库的方法需要大量读取check if data exists in firebase,而这种方法是为了加快请求{{ 3}}
我不确定我是否能正确执行所有这些读取操作,尤其是因为读取量如此之大,谢谢。
exports.postMadeByFriend = functions.https.onCall(async (data,context) => {
const mainUserID = "hJwyTHpoxuMmcJvyR6ULbiVkqzH3";
const follwerID = "Rr3ePJc41CTytOB18puGl4LRN1R2"
const otherUserID = "q2f7RFwZFoMRjsvxx8k5ryNY3Pk2"
var promises = [];
console.log("start")
var refs = [];
for(var x = 0; x < 100000; x +=1){
if (x === 999){
const ref = admin.database().ref(`Followers`).child(mainUserID).child(follwerID)
refs.push(ref);
continue;
}
const ref = admin.database().ref(`Followers`).child(mainUserID).child(otherUserID);
refs.push(ref);
}
function runQuery(ref){
return ref.once('value');
}
const batches = _.chunk(refs, 10000);
refs = [];
const results = [];
while (batches.length) {
const batch = batches.shift();
const result = await Promise.all(batch.map(runQuery));
results.push(result)
}
_.flatten(results);
console.log("results: " + JSON.stringify(results));
})