Firebase большой объем запросов: превышен максимальный размер стека вызовов - PullRequest
0 голосов
/ 31 декабря 2018

В отношении этого ответа большое количество обещаний о том, как обрабатывать большое количество запросов. Я перегруппировал запросы, как показано, используя библиотеку 'lodash', которая работает для небольшого числа запросов, однако в Firebaseвозвращает ошибку

@ firebase / database: FIREBASE WARNING: Исключение было вызвано обратным вызовом пользователя.RangeError: Превышен максимальный размер стека вызовов

Что я знаю, это означает, что массивы слишком велики, однако, когда я пытаюсь запустить чистые обещания Javascript с таймером 10 мс, код, кажется, содержит до 1 000 000 какпоказано в этом ответе.Я не уверен, является ли это проблемой firebase или node.js, но, учитывая, что база данных firebase в реальном времени может хранить миллионы записей в дереве JSON, должен быть лучший способ обработки такого количества обещаний.Я в значительной степени основывал подход на основе этих трех вопросов, это была первоначальная проблема Найти узлы элементов, содержащиеся в другом узле , этот подход для проверки базы данных, который требует так много операций чтения , проверяет, существуют ли данные вfirebase , и этот подход для ускорения запросов Ускоряет выборку сообщений для моего приложения в социальной сети, используя запрос вместо неоднократного наблюдения одного события

Я не уверен, что яЯ выполняю все эти чтения правильно, особенно потому, что это такой большой объем, спасибо.

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));

})
...