Firebase каждый раз возвращает объект с разными именами - PullRequest
0 голосов
/ 01 июня 2018

У меня есть этот запрос:

const questionsRef = firebase
.database()
.ref('Works')
.orderByChild('firebaseKey')
.equalTo(this.props.match.params.id);

И это работает, но взамен я получаю это:

"-LDvDwsIrf_SCwSinpMa": { //!!!this is different for every object I get
    "answers": {
        "-LDvEEpkgbB9WFQDHuUZ": {
            "date": {...},
            "downloadURL": "https://firebasestorage.googleapis.com/v0/b/uczsieapp.appspot.com/o/images%2F483a1473-3056-4817-a495-9edb6589873e?alt=media&token=dae88bc8-fa39-4a36-97a4-7c9bbcb3898b",
            "firebaseKey": "-LDvEEpkgbB9WFQDHuUZ",
            "seen": true,
            "workKey": "-LDvDwsIrf_SCwSinpMa"
        }
    },
    "available": true,
    "boostAmount": 1,
    "category": "Historia",
    "createDate": {...},
    "creatorID": "tZS6bfXUujNXUAi6Rd0nPlmye693",
    "finishDate": {...},
    "firebaseKey": "-LDvDwsIrf_SCwSinpMa",
    "level": "Liceum",
    "number": 1,
    "photoURL": "https://firebasestorage.googleapis.com/v0/b/uczsieapp.appspot.com/o/images%2F365bfdd3-351f-4fb9-bca0-35890b2fc16d?alt=media&token=ed1f88bd-00ce-462a-b8eb-2fb4d2850142",
    "pointAmount": 32,
    "pointBoost": 64,
    "solverID": "tZS6bfXUujNXUAi6Rd0nPlmye693",
    "state": "Completed",
    "taskAmount": 4
},

И дело в том, что: -LDvDwsIrf_SCwSinpMa это идентификатор,И каждый раз он возвращает другой идентификатор.Так, как я могу даже автоматизировать это?Прямо сейчас я получаю это так:

componentDidMount() {
    // var key = ;
    const questionsRef = firebase.database().ref('Works').orderByChild('firebaseKey').equalTo(this.props.match.params.id);
    questionsRef.on('value', (snapshot) => {
        let question = snapshot.val();
        console.log(question);
        let newState = {
            id: question.id,
            category: question.category,
            level: question.level,
            pointAmount: question.pointAmount,
            pointBoost: question.pointBoost,
            photoURL: question.photoURL,
        };
        console.log(newState);
        this.setState({
            question: newState
        });
    });
}

Так как же я могу получить информацию об объекте, если он каждый раз возвращает другой идентификатор?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

questionsRef - это запрос (см. doc )

Вызывая on() для этого запроса, вы «прослушиваете изменения данных в« месте »запроса.«обратный вызов будет срабатывать при каждом изменении данных», см. документ здесь . Поэтому, если вы каждый раз получаете другой объект, это происходит потому, что объект был создан под узлом, соответствующим вашему запросу (вероятно, новый answer относительно JSON, который вы опубликовали в своем вопросе).

Так что, если вы хотите получить конкретное значение одного узла, вы должны использовать once(), который будет«прослушивать ровно одно событие указанного типа события, а затем останавливает прослушивание». doc здесь здесь .

Обратите также внимание на то, что «даже когда для запроса есть только одно совпадение,снимок представляет собой список ". Это означает, что вам нужно" зациклить результат ", например:

questionsRef.once('value', function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});

См. подробную документацию здесь: https://firebase.google.com/docs/database/web/lists-of-data#listen_for_value_events

0 голосов
/ 01 июня 2018

Если questionsRef равно

   {
       "-LDvDwsIrf_SCwSinpMa": {
           "answers": {},
           ......
      }
    }

*, 1005 * будет равно LDvDwsIrf_SCwSinpMa

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...