Firebase大量查询:超出最大调用堆栈大小

时间:2018-12-31 05:16:10

标签: node.js firebase-realtime-database google-cloud-functions firebase-admin

参考有关如何处理大量查询的答案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));

})

0 个答案:

没有答案