我在firebase中返回数据时看到child_added
和value
之间的差异。使用value
我可以测试snapshot.val()
是否已经返回某些内容,或者不使用它:
获取数据:
ref.orderByChild('appUserName')
.equalTo(issuer)
.once('value')
.then(function (snapshot) {
var value = snapshot.val();
if (value) {
// Has Value...
}else{
//Has No Value...
}
数据结构:
AppUsers --
234jl23jl4kj23 --
data --
//.. data
userName : "testUser1",
userPass: "password123"
9873h23foiu34u
//same structure
o8987s52df134o
//same structure
如果我console.log
值如何返回snapshot.val()
,则返回生成密钥级别的数据:
{234jl23jl4kj23 --
{data --
//.. data
userName : "testUser1",
userPass: "password123"}}
如果我使用child_added
获取数据:
ref.orderByChild('appUserName')
.equalTo(issuer)
.once('child_added')
.then(function (snapshot) {
var value = snapshot.val();
if (value) {
// Has Value...
}else{
//Has No Value...
}
如果.then
未找到issuer
的值,它甚至不会进入appUserName
函数,所以我无法在firebase函数中看到它是否有值。 child_added
获取数据的方式也更深一层。它不是返回生成的键,而是返回该键中的值:
{data --
//.. data
userName : "testUser1",
userPass: "password123"}
我更喜欢以这种方式使用它,因为它将是一个较少的循环,我必须检查以首先获取密钥内的数据,然后循环数据点中的对象。但是,如果issuer
不在appUserName
,我就不会进入函数,即使是if
else
有没有办法可以在没有循环的情况下尽可能深入child_added
,但仍然可以if else
检查snapshot.val()
是否有任何内容?
答案 0 :(得分:7)
child_added
事件将为您查询的节点下的每个匹配子项触发。如果没有匹配的孩子,则不会开火。
这意味着要测试节点是否存在,您必须使用value
处理程序。由于查询可以有多个结果,因此您需要循环遍历子项。