使用Firebase监听嵌套更改的正确方法是什么?

Ben*_*rey 5 javascript firebase

背景:

我正在尝试使用Firebase,Twilio和Node.js通过浏览器发送SMS消息。我当前在Firebase中的数据结构如下所示:

{ messages :
  { +15553485 :
    { FB-GENERATED-KEY-1 :
      { body: "hello world"
        timestamp: 1461758765472 }
    },
    { FB-GENERATED-KEY-3 :
      { body: "I love dogs"
        timestamp: 1461758765475 }
      }
    }
  },
  { +15550000 :
    { FB-GENERATED-KEY-2 :
      { body: "goodbye world"
        timestamp: 1461758765473 }
    },
    { FB-GENERATED-KEY-4 :
      { body: "I love cats"
        timestamp: 1461758765476 }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

通过前端将消息添加到Firebase时,后端需要得到通知才能通过Twilio发送SMS。当后端(通过Twilio)从电话获得回复时,它将其添加到Firebase。

问题:

当我侦听线程的更改时,我会收到该电话号码发送/接收的所有消息。显然,后端不想再次发送所有消息,所以我只对添加到线程中的最新消息感兴趣。

另外,我似乎也不太容易获得电话号码(按键),该电话号码下方带有消息。

我尝试过的

ref.child('messages').on('child_added', ...)—这适用于添加到的新电话号码/messages,但是Firebase不会通过新电话号码(键)发送邮件,仅从FB-GENERATED-KEY-2下往下发送所有邮件。

ref.child('messages').on('child_changed', ...)—这将返回线程中的所有消息,而不仅仅是新消息。我可以在服务器上进行排序并找到最新的消息,但这似乎很快就会变得很繁重–如果您发送了数千条消息该怎么办?

可以在根级别存储消息(也就是将树扁平化)并将数字存储为属性,但是可以,但是我将需要使用电话号码作为索引,以便以后与其他数据连接(例如外键)。

问题:

  • 在聆听父母的活动/messages而不是特定的电话号码时,如何仅获得最新消息?
  • 使用child_事件时如何获取密钥(电话号码)?
  • 这种数据结构有意义吗?

kol*_*lli 3

key()您可以通过调用侦听器返回的快照来获取 Firebase 密钥child_added

然后你可以添加另一个嵌套监听器,如下所示:

ref.child('messages').on('child_added', function (snapshot) {
    var phone = snapshot.key();
    ref.child('messages').child(phone).on('child_added', function (message) {
        //send SMS
    }, function (error) {

    });
}, function (error) {

});
Run Code Online (Sandbox Code Playgroud)