簡體   English   中英

使用Firebase監聽嵌套更改的正確方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM