Как сортировать и фильтровать базу данных Firebase Realtime с облачными функциями, Node.js & Javascript для таблицы лидеров «High Score» - PullRequest
0 голосов
/ 02 мая 2020

Я искал и делал метод проб и ошибок в течение нескольких дней, но не смог заставить что-либо работать. При тестировании я создал несколько тестовых узлов в моей базе данных Firebase Realtime, чтобы попытаться отработать логи функции c. Мое дерево файлов выглядит так:

enter image description here

Просто пытаясь заставить работать основы, я создал несколько пользователей в узле TestUsers, каждый из которых имеют очень простую дочернюю структуру Statistics, а затем значение orbs.

Что я пытаюсь сделать:

После обновления orbs значение для любого из пользователей, я хочу написать (ну, технически «обновить») дочерние элементы Output/firstPlace, чтобы включить имя пользователя и количество шаров для первых трех пользователей (которые имеют наибольшее количество шаров из всех пользователей) под TestUsers.

Кажется очень простым, и, поверьте мне, я знаю, что есть тонна документации по сортировке и фильтрации данных в базе данных Firebase Realtime Database, но я не смог собрать это воедино за несколько дней чтения эта документация.

Я использую VS Code для написания своих функций и развертываю их в своем проекте Firebase.

Функция, которую я написал, чтобы попытаться выполнить вышеизложенное, такова:

//Define a new function with a base path and set it to run when a child of this path is changed
exports.testTopPlayers1 = functions.database.ref('/TestUsers/{user}/Statistics').onUpdate(_ => { 

    var allPlayersRef = admin.database().ref('/TestUsers/{user}'); //When this function runs, assign a new path of all users

        //Get a snapshot of the top 3 users with the highest orb count
        allPlayersRef.orderByChild('orbs').limitToLast(3).once('value', (snap) => { 

          //For each child from the above snap (should be 3)...
          snap.forEach((child, context) => {

                const username = context.params.user; //Assign the username to a const
                const afterOrbAmount = child.after.val();
                const orbAmount = afterOrbAmount.orbs; //Assign the number of orbs to a const

                //Return (Promise?) by updating the data in '/Output/firstPlace' with the username and orb amount.
                return admin.database().ref('/Output/firstPlace').update({[username]: [orbAmount]});
          });
  })
})

Я бы ожидал, что с .forEach он должен выполнить запись в '/Output/firstPlace часть 3 раза, что даст мне 3 новые пары ключ-значение. Но ничего не происходит.

Исходя из того, что я пытаюсь сделать, вы можете либо исправить мой код, либо показать мне правильный способ добиться сортировки высоких результатов, как это на бэкэнде?

1 Ответ

1 голос
/ 02 мая 2020

Вы не возвращаете ничего из верхнего уровня вашего кода, а это значит, что облачные функции не могут знать, когда ваш код готов. Следовательно: он останавливает ваш код после последнего }, то есть до завершения чтения базы данных.

Ваш код должен выглядеть примерно так:

exports.testTopPlayers1 = functions.database.ref('/TestUsers/{user}/Statistics').onUpdate(_ => { 

    var allPlayersRef = admin.database().ref('/TestUsers/{user}'); //When this function runs, assign a new path of all users

    let query = allPlayersRef.orderByChild('orbs').limitToLast(3)
    return query.once('value').then((snap) => { 
        let promises = [];
        snap.forEach((child, context) => {
            const username = context.params.user;
            const afterOrbAmount = child.after.val();
            const orbAmount = afterOrbAmount.orbs;

            promises.push(admin.database().ref('/Output/firstPlace').update({[username]: [orbAmount]}));

        });
        return Promise.all(promises);
    })
})

Может быть больше проблемы в вашем коде, но это гарантирует, что ваша облачная функция будет работать до тех пор, пока не будут выполнены запрос и последующие обновления.

Я настоятельно рекомендую изучить следующее, чтобы узнать больше о том, как контролировать, когда облачная функция завершается:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...