В вашем коде следует отметить несколько ошибок и моментов:
Во-первых, , если вы получаете сообщение об ошибке 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;
});