如何获取Firebase Node子级

问题描述

我刚开始在JavaScript上使用Firebase,所以这很可能是一个愚蠢的问题,并且可能是一个重复的问题,但是我很难从每个“任务”中获取这两个孩子。我尝试使用[“ Task”]和[“ Status”]访问任务的属性,但对我来说显示为未定义。

Firebase Database

var members = projectRef.child("Data").child("Members").orderByKey().startAt(firebase.auth().currentUser.uid).once('value').then(function(snapshot) // Gets all members with their data
{
    var data = [];
    
        var taskArray = [];
    
        snapshot.forEach(function(childSnapshot) // Goes to each member
        {
                var childData = childSnapshot.val(); // Gets all of the member's children as an object from the childSnapshot
    
                var childTasks = childData.Tasks;

        
                if(childTasks)
                {
                      console.log(childTasks);

                      for (task in childTasks)
                      {
                           console.log(task);
                           console.log(task["Status"]);
                           console.log(task["Task"]);
                      }
                }
    
                data.push(childData);
         });

    
         return data;                    
});

childTasks的结果

{
  '-ME2IdeYYwHqWJ82ynob': { Status: 'Not completed',Task: 'flsdjlfksdjflksd' },'-ME5YHsoMVxX5sTq5RVA': { Status: 'Not completed',Task: 'lfjsdlkfjslkdfjlksf' },'-ME5YKh30-rs_Fq2QhBU': { Status: 'Not completed',Task: 'sflksdjfsklfjdksljsdlf' }
}

任务,任务[“状态”]和任务[“任务”]的结果

-ME2IdeYYwHqWJ82ynob
undefined
undefined
-ME5YHsoMVxX5sTq5RVA
undefined
undefined
-ME5YKh30-rs_Fq2QhBU
undefined
undefined

解决方法

您似乎在最低级别的重复节点类型上缺少forEach

projectRef.child("Data").child("Members").orderByKey().startAt(firebase.auth().currentUser.uid).once('value').then(function(snapshot) {
    snapshot.forEach(function(memberSnapshot) {
        var tasksSnapshot = memberSnapshot.child("Tasks");

        tasksSnapshot.forEach(function(taskSnapshot) {
            console.log(taskSnapshot.val());
            console.log(taskSnapshot.child("Status").val());
        })
     });
});

我强烈建议您进行的更改:

  • 在调用val()之前,请尽可能长地浏览快照。
  • 为快照提供有意义的名称,以表示JSON中的实体。

尽管如此,一般来说,您似乎可以用直接查找代替初始查询,因为您似乎想通过成员的UID查找成员,并且它是唯一的。通过直接查找用户(及其Tasks节点(,),您可以删除另一个forEach循环,从而使代码更易于阅读:

var memberRef = 
projectRef.child("Data").child("Members").child(firebase.auth().currentUser.uid);
memberRef.once('value').then(function(memberSnapshot) {

    var tasksSnapshot = memberSnapshot.child("Tasks");

    tasksSnapshot.forEach(function(taskSnapshot) {
        console.log(taskSnapshot.val());
        console.log(taskSnapshot.child("Status").val());
    })
});

并且由于您仅使用Tasks子节点,因此可以将其进一步简化为:

var memberRef = 
projectRef.child("Data").child("Members").child(firebase.auth().currentUser.uid);
var tasksRef = memberRef.child("Tasks");
tasksRef.once('value').then(function(tasksSnapshot) {
    tasksSnapshot.forEach(function(taskSnapshot) {
        console.log(taskSnapshot.val());
        console.log(taskSnapshot.child("Status").val());
    })
});