【问题标题】:Cannot query from Firebase for my React Native app?无法从 Firebase 查询我的 React Native 应用程序?
【发布时间】:2019-02-01 11:01:37
【问题描述】:

看来我可以通过以下方式从我的 Firebase 实时数据库中检索 所有我的数据:

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: 异常被用户回调抛出。

TypeError: 无法将 undefined 或 null 转换为对象

这就是我尝试查询信息的方式...完全按照文档进行操作,并且当我检索所有信息时我的代码可以正常工作,但当我所做的唯一更改是添加查询时却不行?

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 上的结构方式:

【问题讨论】:

  • 所以你可能猜到的错误是因为 Object.values(data) 和 data 为空。问题是您在数据库中是否有具有指定查询参数的数据?在某处你试图查询不存在的东西。在继续之前,首先尝试 console.log 你的数据,看看你看到了什么。您也可以轻松使用 chrome 开发工具控制台
  • 另外,也许添加您的数据结构,它可能会更好地了解您正在尝试做什么或问题。
  • 另外,如果您是新手,我鼓励您也研究一下 Firestore,因为 Firestore 寻址的实时数据库存在限制。
  • @TheeBen 我编辑了我的问题并发布了我的 Firebase 数据结构的图像。我的数据库中确实有一些“roundedBPM”为 100 的歌曲,那么为什么数据为空?非常感谢!

标签: javascript firebase react-native firebase-realtime-database jsx


【解决方案1】:

我会尝试在 dbConfig.js 中初始化 firebase,例如:

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 时它是一个数字而不是一个字符串,你不会得到任何数据。确保使用正确类型的数据。

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多