'child_added'和'value'firebase之间的差异?

Chi*_*ipe 6 javascript firebase firebase-realtime-database

我发现在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...
      }
Run Code Online (Sandbox Code Playgroud)

数据结构:

AppUsers --
    234jl23jl4kj23 --
        data --
            //.. data
        userName : "testUser1",
        userPass: "password123"
    9873h23foiu34u
        //same structure
    o8987s52df134o
        //same structure
Run Code Online (Sandbox Code Playgroud)

如果我console.log返回了值,snapshot.val()它返回生成密钥级别的数据:

{234jl23jl4kj23 --
    {data --
        //.. data
    userName : "testUser1",
    userPass: "password123"}}
Run Code Online (Sandbox Code Playgroud)

如果我使用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...
      }
Run Code Online (Sandbox Code Playgroud)

.then如果issuer找不到值appUserName,它甚至不会进入函数,所以我不能在firebase函数中看到它是否有值.此外,child_added获取数据的方式更深一层.它不是返回生成的键,而是返回该键中的值:

{data --
   //.. data
userName : "testUser1",
userPass: "password123"}
Run Code Online (Sandbox Code Playgroud)

我更喜欢这样使用它,因为它将是一个较少的循环,我必须检查首先获取密钥内的数据,然后循环数据点中的对象.但是,如果issuer不在appUserName其中,我甚至不会为我做功能if else

有没有办法在child_added没有循环的情况下深入钻取,但仍然能够if else检查是否snapshot.val()有任何东西?

Fra*_*len 7

child_added在您查询的节点下触发每个匹配子节点的事件.如果没有匹配的孩子,则不会开火.

这意味着要测试节点是否存在,您必须使用value处理程序.由于查询可以有多个结果,因此您需要遍历子项.