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