【问题标题】:Firebase query DataSnapshot val() returning nullFirebase 查询 DataSnapshot val() 返回 null
【发布时间】:2017-09-26 20:00:29
【问题描述】:

我的 Firebase 结构如下

  {
  "Test1 Lab" : {
    "Equipment" : "3-D printer",
    "Hours" : "7AM-6PM",
    "Location" : "Library",
    "Name" : "Digital Lab"
  },
  "Test2 Lab" : {
    "Equipment" : "Oculus",
    "Hours" : "7AM-6PM",
    "Location" : "Hall",
    "Name" : "Test Lab"
  }
}

顶层称为“创客空间”。我正在尝试获取位置为“库”的项目的名称、设备和时间我运行了代码:

var red = database.ref('makerspace');
    return red.orderByChild('Location').equalTo("Library").once('value').then(function(snapshot){
            console.log(snapshot.child("makerspace").child("Name").key);
    });

然后我得到“名字”。但是,当我将 .key 更改为 .val() 时,我应该期望得到“数字实验室”,但我得到了 null。我不知道如何解决这个问题。

【问题讨论】:

  • 您的snapshot 包含makerspace 节点下的值。那么snapshot.child("makerspace") 没有任何意义。试试snapshot.child("Name").val()
  • 使用 snapshot.child("Name").val() 给我 null
  • 我认为你需要一个 forEach 循环来从 snapshot 获取数据

标签: javascript database firebase firebase-realtime-database


【解决方案1】:

快照已经在makerspace节点上,所以应该是:

var red = database.ref('makerspace');
return red.orderByChild('Location').equalTo("Library").once('value').then(function(snapshot){
        console.log(snapshot.child("Name").val());
});

【讨论】:

  • 我试过这个,它打印出空值。 Snapshot.key 为创客提供空间。
  • 在回调中尝试console.log(snapshot,val()) 以查看快照中的信息。
  • console.log(snapshot.val()) 返回 null
  • 似乎没有符合这些条件的数据,`Location === Library'。
  • 但是应该有,上面的Json就是我正在使用的那个。
【解决方案2】:

试试这个

var red = database.ref('makerspace');
return red.orderByChild('Location').equalTo("Library").once('value').then(function(snapshot){
    snapshot.forEach(function(data) {
       console.log(data.val());
    });
});

【讨论】:

  • 我收到了这个错误:(index):104 Uncaught (in promise) TypeError: Cannot read property 'Name' of null
  • 删除这个.orderByChild('Location').equalTo("Library")并检查它是否工作
  • 仍然没有打印出来
【解决方案3】:

我建议像这样访问快照数据,

red.orderByChild('Location').equalTo("Library").once('value').then(function(snapshot){
       console.log(snapshot.val());   <==========
       // result would be
{ "Test1 Lab" : { "Equipment" : "3-D printer","Hours" : "7AM-6PM","Location" : "Library","Name" : "Digital Lab" } }
        }

要获得你可以做的属性,

       snapshot.val()['Test1 Lab']['Name'] or snapshot.val()['Test1 Lab'].Name
       snapshot.val()['Test1 Lab']['Hours']

现在您可以使用 Object.keys(snapshot.val())[0] 获得“Test1 Lab”

snapshot.val() 类似于 JSON 对象,因此只需像访问对象一样访问其属性。无需使用 child() 方法访问数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2021-05-29
    • 2018-08-19
    相关资源
    最近更新 更多