我正在开发一个实时应用程序,我正在使用带有纯HTML和javascript(不是angularJS)的firebase。
我遇到一个问题,我用Firebase的给定代码将用户的数据保存到firebase:
var isNewUser = true;
ref.onAuth(function(authData) {
if (authData && isNewUser) {
authData['status'] = 'active';
authData['role'] = 'member';
ref.child("users").child(authData.uid).set(authData);
}
});
这会将authData添加到/users/
节点。如您所见,我还将一些自定义字段附加到authData,status和role。
现在我正在使用此代码从firebase获取用户的数据并显示它们。
ref4.on("value", function(snapshot) {
var snapshotData = snapshot.val();
console.log('username: '+snapshotData.status);
});
如果我使用on('value')
,状态会在控制台上打印出来,但如果我这样做,
ref4.on("child_added", function(snapshot) {
var snapshotData = snapshot.val();
console.log('status: '+snapshotData.status);
});
显示状态未定义。我可以知道什么是错的以及如何解决这个问题。谢谢。
答案 0 :(得分:1)
由于value
返回ref4提供的路径,而child_added
正在返回该路径的每个子节点,因此两者都不可能具有密钥状态。
考虑这个数据结构:
{
"users": {
"brucelee": {
"status": "awesome"
},
"chucknorris": {
"status": "awesomerest"
}
}
}
如果我现在根据你不完整的例子来查询:
var ref = new Firebase('https://<instance>firebaseio.com/users/brucelee');
ref.on('value', function(snap) {
// requests the brucelee record
console.log(snap.name(), ':', snap.val().status); // "brucelee: awesome"
});
ref.on('child_added', function(snap) {
// iterates children of the brucelee path (i.e. status)
console.log(snap.name(), ':', snap.val().status); // THROWS AN ERROR, because status is a string
});
所以要在child_added上使用这样的数据结构(可能有点像你的)这样做,它看起来如下:
ref.on('child_added', function(snap) {
// iterates children of the brucelee path (i.e. status)
console.log(snap.name(), ':', snap.val()); // "status: awesome"
});