Как мне получить значения каждого ключа в базе данных Firebase в реальном времени?

# #reactjs #firebase #firebase-realtime-database

Вопрос:

Сначала я получил только значения каждого ключа, но теперь я понял, что мне понадобятся сами ключи, а затем я получу значения этих ключей. Я прокомментировал то, что делал раньше.

Структура базы данных

     // READ LIST OF STORIES (myFirebase.js)
  getListOfStories(location, callWhenFinished) {
      let ref = firebase.database().ref(location)
      ref
      .once("value")
      .then((snapshot) => {
          let listOfStoryKeys = [];
          snapshot.forEach(function(childSnapshot) {
              var key = childSnapshot.key
              listOfStoryKeys.push(key);
          })
          for (var storyKey in listOfStoryKeys) {
              // printing each story key
              console.log(listOfStoryKeys[storyKey])
          }
          callWhenFinished(listOfStoryKeys);
          // var listOfStories = snapshot.val() || []  // all stories or none at all
          // callWhenFinished(Object.values(listOfStories));
      })
      .catch((error) => {
          console.log("Couldn't get list of objects: "   error);
          callWhenFinished([])
      });
  }

 // OTHERPAGE.js Show stories and their values from the DB and into the console 
  displayStoriesOnPage = (stories) => {
    if (stories.length === 0) {
      console.log("Error: Did not get list of stories!");
      return;
    }
    // Initially got all the values of each story;
    // Now need to get values of each story using their keys
    /*
    console.log(stories);
    for (var iStory in stories) {
      const story = stories[iStory]
      console.log("Story: "   story);
      for (var iAttr in story) {
        const attr = story[iAttr];
        console.log("t "   iAttr   ": "   attr);
      }
    }
    */
    this.setState((state) => {
      return {
        ...state,
        allStories: stories,
      };
    })
  }
 

Комментарии:

1. Вы можете объяснить? Что у вас есть об этой истории и что вы хотите получить?

2. @ Dharmaraj Я хотел бы получить значения (фактические данные), используя каждый ключ. Например, ключ «-MftXA1QzVOMnf4qbako» должен предоставить мне все свои данные или дочерние элементы (imgID, язык, местоположение, статус, название, идентификатор пользователя). Сначала я просто легко получал каждый набор данных, но теперь я изо всех сил пытаюсь получить набор данных с помощью его уникального ключа

3. Когда вы извлекаете данные, вы ничего не храните, кроме ключей. Теперь вы можете сделать еще один запрос в Firebase, чтобы получить данные ключа, установив значение ref .ref("stories/" theKey) , но это излишне. Следуйте подробному ответу @Frank.

4. Также опубликовано на reddit.com/r/Firebase/comments/ova4y0/…

Ответ №1:

Если вам нужны как ключи, так и значения историй, один из способов сделать это-передать два параметра для обратного callWhenFinished вызова:

   getListOfStories(location, callWhenFinished) {
      let ref = firebase.database().ref(location)
      ref
      .once("value")
      .then((snapshot) => {
          let listOfStoryKeys = [],
              listOfStoryValues = [];
          snapshot.forEach(function(childSnapshot) {
              listOfStoryKeys.push(childSnapshot.key);
              listOfStoryValues.push(childSnapshot.val());
          })
          callWhenFinished(listOfStoryKeys, listOfStoryValues);
      })
      .catch((error) => {
          console.log("Couldn't get list of objects: "   error);
          callWhenFinished([], [])
      });
  }
 

Вы также можете поместить ключи и значения в один массив, присвоив ключу имя, которое вы не используете ни для одного из ваших других свойств (например $key ). Это выглядело бы примерно так:

   getListOfStories(location, callWhenFinished) {
      let ref = firebase.database().ref(location)
      ref
      .once("value")
      .then((snapshot) => {
          let listOfStories = [];
          snapshot.forEach(function(childSnapshot) {
              let story = childSnapshot.val();
              story["$id"] = childSnapshot.key;
              listOfStories.push(story);
          })
          callWhenFinished(listOfStories);
      })
      .catch((error) => {
          console.log("Couldn't get list of objects: "   error);
          callWhenFinished([])
      });
  }
 

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