[英]What is the correct way to listen to nested changes using Firebase?
背景:
我正在嘗試使用Firebase,Twilio和Node.js通過瀏覽器發送短信。 我在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 }
}
}
}
}
當消息通過前端添加到Firebase時,后端需要得到通知才能通過Twilio發送短信。 當后端從手機獲得回復時(通過Twilio),它會將其添加到Firebase。
問題:
當我收聽線程的更改時,我會收到針對該電話號碼發送/接收的所有消息。 顯然后端不想再發送所有消息,所以我只對添加到線程中的最新消息感興趣。
此外,我似乎無法輕易獲得其下面有消息的電話號碼(密鑰)。
我嘗試過的:
ref.child('messages').on('child_added', ...)
- 這適用於在/messages
添加的新電話號碼,但Firebase不通過新電話號碼(密鑰)發送,只有一切從FB-GENERATED-KEY-2
下來。
ref.child('messages').on('child_changed', ...)
- 這將返回線程中的所有消息,而不僅僅是新消息。 我可以在服務器上排序並找到最新的消息,但這似乎會很快變得很重 - 如果你發送了數千條消息怎么辦?
在根級別存儲消息(也就是說,展平樹)並將數字存儲為屬性可能會起作用,但是我將需要使用電話號碼作為一種索引以便稍后與其他數據連接(如外鍵)。
問題:
/messages
上的活動而不是特定電話號碼時才能獲取最新消息? child_
事件時獲取密鑰(電話號碼)? 您可以通過調用child_added
偵聽器返回的快照上的key()
來獲取Firebase密鑰。
然后你可以像這樣添加另一個嵌套的監聽器:
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) {
});
Firebase API允許您監聽值的變化或子節點的操作。 它沒有辦法傾聽大孩子的變化。
在NoSQL數據庫中,您經常需要根據應用程序使用它的方式對數據建模。 如果我看一下你的具體用例:
當消息通過前端添加到Firebase時,后端需要得到通知才能通過Twilio發送短信。
我在這里看到一個隊列:
smsQueue: {
pushId1: {
number: "+15553485",
body: "hello world",
timestamp: 1461758765472
},
pushId2: {
number: "+15550000",
body: "goodbye world",
timestamp: 1461758765473
},
pushId3: {
number: "+15553485",
body: "I love dogs",
timestamp: 1461758765475
},
pushId4: {
number: "+15550000",
body: "I love cats",
timestamp: 1461758765476
}
}
使用此結構,后端(希望使用firebase-queue )可以從隊列中獲取每個任務,調用twilio並從隊列中刪除該項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.