fiirebase result.val равен нулю с ожиданием

javascript firebase firebase-realtime-database

51 просмотра

1 ответ

Какова структура ответа запросов Firebase? Есть ли документация? Я не мог ничего найти. Я не знаю, почему пользователь пуст. Нужно ли бежать за цикл и получить первый элемент?

const result = await firebase.child('users').orderByChild('email')
    .equalTo(memberEmail).limitToFirst(1)
    .once('value');
const user = result.val();

следующий код работает, но я не хочу запускать цикл, чтобы получить одно значение. Как получить пользователя без запуска цикла?

result.forEach((value) => {
          alert(`user = ${JSON.stringify(value.val())}`);
      });
Автор: user43286 Источник Размещён: 08.11.2019 11:05

Ответы (1)


1 плюс

Решение

Когда вы выполняете запрос к базе данных Firebase, потенциально может быть несколько результатов. Таким образом, снимок содержит список этих результатов. Даже если есть только один результат, снимок будет содержать список из одного результата. Поэтому, если вы используете запрос, вам всегда понадобится цикл.

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

const result = await firebase.child('users').child(currentUser.uid).once('value');
const user = result.val();

Если вы хотите сохранить пользователей по их электронным адресам (вам придется их кодировать, поскольку .в ключе нельзя использовать a ), вы также можете получить доступ к пользователям по их электронному адресу.

Идиоматический способ сделать это с Firebase - сохранить отдельный узел, который отображает адреса электронной почты на uids. Затем вы бы сделали два прямых поиска:

  1. firebase.child('emailToUid').child(email)
  2. firebase.child('users').child(uid)

Каждый из них будет возвращать один узел (или нет узла, если совпадение не найдено), так что вы можете связать ожидающие и не будете нуждаться в цикле

Автор: Frank van Puffelen Размещён: 20.08.2016 02:26
32x32