Данные моментального снимка базы данных администратора Firebase после запроса?

Настраивать

Представим, что это мои данные JSON

values: {
    a: {
        randomValue: "set",
        sorter: 1
    },
    b: {
        randomValue: "hat",
        sorter: 2
    }
}

Я могу извлекать данные из своей базы данных с помощью базы данных администратора (из облачных функций) следующим образом.

admin.database().ref('values/a').once('value').then(snapshot => {
    console.log(snapshot.val().randomValue + ' .. ' + snapshot.val().sorter);
});

Вывод будет set .. 1.

Проблема

Как только я прикрепляю запрос к моему запросу, он перестает работать, т.е. он не работает, как указано в документации. Там они могут очевидно получить доступ к snapshot.val().height с запросом.

Хотя, когда я делаю свой запрос, как это

admin.database().ref('values').orderByChild('sorter').equalTo(1).once('value').then(snapshot => {
    console.log(snapshot.val());
    console.log(snapshot.val().randomValue + ' .. ' + snapshot.val().sorter);
    console.log(snapshot.child('randomValue').val() + ' .. ' + snapshot.child('sorter').val());
}

Вывод неожиданно будет следующим

a: {
    randomValue: "set",
    sorter: 1
}
undefined .. undefined
null .. null

Итак, snapshot.val() дает мне все мои данные, но ни один способ доступа не даст мне никаких данных, только undefined или null! Почему это так?


person creativecreatorormaybenot    schedule 07.08.2017    source источник


Ответы (1)


Я считаю, что в этом случае вам нужно получить доступ к полям как snapshot.val().a.randomValue. Обратите внимание, что вы выполняете запрос к узлу values, а не к узлу values/a. Поэтому ваш результат содержит свойство a.

Обновить

Когда вы запускаете запрос к узлу values и подписываетесь на событие value (это то, что метод once() делает внутри), вы получаете полное значение (родительский ключ + дочерний) запроса. Чтобы получить только дочерний элемент, вам необходимо подписаться на дочернее событие< /а>. Это то, что делают образцы в документации. Например:

admin.database().ref('values').orderByChild('sorter').equalTo(1).once('child_added').then(snapshot => { console.log(snapshot.val()); console.log(snapshot.val().randomValue + ' .. ' + snapshot.val().sorter); console.log(snapshot.child('randomValue').val() + ' .. ' + snapshot.child('sorter').val()); });

даст результат, который вы пытаетесь получить:

{ randomValue: 'set', sorter: 1 } set .. 1 set .. 1

person Hiranya Jayathilaka    schedule 08.08.2017
comment
о, спасибо! Теперь я понимаю. Мне нужно использовать событие child_added. - person creativecreatorormaybenot; 09.08.2017