Firebase запрос с Vue JS - PullRequest
1 голос
/ 16 мая 2019

Я новичок в Vue JS и в Firebase. Моя цель - получить все «Eventos», которые имеют ту же категорию. Я имею в виду, что у меня есть два эвента, категория эвентов "SMIX", а в другой "DAM". Теперь я хочу получить Eventos имеет категорию «SMIX»

Моя структура данных здесь: enter image description here

 created() {
            var datos = []

            firebase.database().ref('usuarios').on("value", data => {

                data.forEach(function(user){
                    user.child("eventos").orderByChild("categoria").equalTo("SMIX")
                        .forEach(function(evento){
                        datos.push(evento.val())
                    });
                });

                this.eventos = datos;
            });
        }[My data Structure][1]

1 Ответ

1 голос
/ 16 мая 2019

В вашем коде следует отметить несколько ошибок и моментов:

Во-первых, , если вы получаете сообщение об ошибке user.child(...).orderByChild is not a function это потому, что с data.forEach(function(user) {...}), user является DataSnapshot (см. forEach() документ), и вызывая метод child() для этого DataSnapshot вы получаете еще один DataSnapshot ... который не имеет orderByChild() метода.

Метод orderByChild() - это метод Reference, поэтому вам нужно сделать

user.child(...).ref.orderByChild()

с использованием свойства ref DataSnapshot


Во-вторых , вы не можете сделать

user.ref.child("eventos").orderByChild("categoria").equalTo("SMIX")
                        .forEach()

потому что вам нужно использовать методы once() или on(), чтобы получить данные в месте базы данных, представленном Reference.


В-третьих , так как вы собираетесь выполнить несколько запросов в цикле, вам нужно использовать метод once() вместо on() метод. Метод on() устанавливает прослушиватель, который постоянно «прослушивает изменения данных в определенном месте».


Наконец, , обратите внимание, что вам нужно использовать Promise.all() для управления параллельными асинхронными запросами к базе данных.


Итак, отметив все вышеперечисленные пункты, следующий код поможет (вставьте created()):

        var datos = []

        firebase.database().ref('usuarios').once('value')
        .then(dataSnapshot => {
            var promises = [];
            dataSnapshot.forEach(user => {    
                promises.push(user.ref.child("eventos").orderByChild("categoria").equalTo("SMIX").once('value'));
            });
            return Promise.all(promises);
        })
        .then(results => {
            //console.log(results);
            results.forEach(dataSnapshot => {
                dataSnapshot.forEach(evento => {
                    datos.push(evento.val());
                });     
            });
            this.eventos = datos;
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...