Кажется, я могу получить все мои данные из моей базы данных Firebase Realtime со следующим:
let itemsRef = firebaseApp.database().ref('/');
itemsRef.on('value', (snapshot) => {
let data = snapshot.val();
let item = Object.values(data);
this.setState({item});
});
Но когда я пытаюсь выполнить запрос с определенными параметрами вместо того, чтобы просто получить всю информацию, я всегда получаю эту ошибку:
@firebase/database: FIREBASE WARNING: Exception was thrown by user callback.
TypeError: Cannot convert undefined or null to object
Вот как я пытаюсь запросить информацию ... буквально следуя документации, и каким-то образом мой код работает, когда я извлекаю всю информацию, но не тогда, когда единственное изменение, которое я делаю, - это добавление запроса?
let itemsRef = firebaseApp.database().ref('/');
itemsRef.orderByChild('roundedBPM').equalTo('100').on('value', (snapshot) => {
let data = snapshot.val();
let item = Object.values(data);
this.setState({item});
});
Есть ли у кого-нибудь еще проблемы с запросами из Firebase, или я что-то делаю не так?
Вот как мои данные структурированы в Firebase:

Кроме того, возможно, добавьте свою структуру данных, это может дать лучшее понимание того, что вы пытаетесь сделать или проблему.
Кроме того, если вы новичок, я бы посоветовал вам также заглянуть в Firestore, поскольку существуют ограничения с базой данных в реальном времени, к которой обращается Firestore.
Также размещено на github.com/firebase/firebase-js-sdk/issues/1167
@TheeBen Я отредактировал свой вопрос и опубликовал изображение своей структуры данных Firebase. У меня определенно есть песни в моей базе данных со значением «roundedBPM», равным 100, так почему же данные нулевые? Огромное спасибо!
Похоже, вы используете строку для сравнения в своем запросе, но значение в вашей базе данных является числом. Вы не пробовали удалить кавычки из equalTo('100')?
кажется, что проблема заключается в строковом / числовом характере вашего запроса и данных. попробуйте equalTo (100), а не ('100')
Большое спасибо!! Это сработало! Наконец-то, боже, я несколько дней пытался заставить это работать!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я бы попробовал инициализировать firebase в dbConfig.js, например, так:
import * as firebase from 'firebase';
let config = {
apiKey: "XXXXXXX",
authDomain: "XXXXX",
databaseURL: "XXXXX",
projectId: "XXXXX",
storageBucket: "XXXX",
messagingSenderId: "XXXX"
};
firebase.initializeApp(config);
export default firebase;
Я бы импортировал firebase, где это:
import firebase from './dbConfig.js'
let itemsRef = firebase.database().ref('/');
itemsRef.orderByChild('roundedBPM').equalTo('100').on('value', (snapshot) => {
let data = snapshot.val();
let item = Object.values(data);
this.setState({item});
});
Примечание: OrderByChild элемент roundedBPM должен быть прямым потомком корневого пути '/', если это вложенный дочерний элемент, вы можете сделать что-то вроде этого:
let itemsRef = firebase.database().ref('/users');
itemsRef.orderByChild('roundedBPM').equalTo('100').on('value', (snapshot) => {
...
});
Примечание: если вы устанавливаете equalTo () roundedBPM, когда это число, а не строка, вы не получите никаких данных. Убедитесь, что вы используете правильный тип данных.
Я надеюсь, это поможет!
Таким образом, ошибка, как вы можете догадаться, связана с Object.values (data), а data имеет значение null. Вопрос в том, есть ли у вас в базе данные с указанными параметрами запроса? где-то вы пытаетесь запросить то, чего не существует. Прежде чем продолжить, сначала попробуйте console.info свои данные и посмотрите, что вы видите. Вы также можете легко использовать для этого консоль chrome dev tools