2016-04-27 94 views
2

背景:使用Firebase侦听嵌套更改的正确方法是什么?

我试图通过使用火力地堡,Twilio和Node.js的浏览器发送短信在火力地堡我目前的数据结构是这样的:

{ 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 } 
     } 
    } 
    } 
} 

当消息通过后端需求,以便通过Twilio发送短信得到通知的前端添加到火力地堡。当后端从手机获得回复时(通过Twilio),它将其添加到Firebase。

当我听到更改到我接收到发送/所有邮件收到该电话号码的线程:

问题。很明显,后端不想再发送所有的消息,所以我只对添加到线程中的最新消息感兴趣。

此外,我似乎无法轻松获得在其下面有消息的电话号码(密钥)。

我已经试过什么:

ref.child('messages').on('child_added', ...) - 这适用于已在/messages添加新的电话号码,但是火力地堡不通过新的电话号码发送(密钥),只有从FB-GENERATED-KEY-2下来的一切。

ref.child('messages').on('child_changed', ...) - 这将返回全部消息在一个线程中,不仅是新的。我可以在服务器上排序并找到最近的消息,但是好像它会很快变得沉重 - 如果您发送了数以千计的消息,该怎么办?

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

问题:

  • 我怎么能只听活动父/messages,而不是一个特定的电话号码时,你得到的最新消息?
  • 如何在使用child_事件时获得密钥(电话号码)?
  • 这个数据结构是否有意义?

回答

2

您可以通过调用你的听众child_added返回快照key()得到火力地堡的关键。

然后你就可以添加其他嵌套的监听器是这样的:

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) { 

}); 
+0

啊!当然,'snapshot.val()'给你的值和'snapshot.key()'给你的关键是有道理的!当新消息添加新号码时,您的答案应该能够很好地工作,但是如何为现有号码添加新消息?我是否使用嵌套的侦听器做类似的事情,但使用'child_changed'事件呢? –

+0

@BenjaminHumphrey你的意思是你已经有一个现有的数据集,当你实现这个?在这种情况下,我可能会在外部侦听器中用'once('value')'做类似的事情。对于新号码,内部监听者将监听所有未来的新消息。 – kolli

+1

不,我的意思是当新消息发送到数据库中已存在的号码时。 'child_added'事件不会触发顶层,因为没有添加新的数字,只有一个新的消息被添加为孙子。不过,我一直在阅读更多关于在Firebase中构建数据的信息,而且听起来我应该将所有内容都进一步扁平化,因此/信息和/数字都处于根级别。请参阅[构建数据](https://www.firebase.com/docs/web/guide/structuring-data.html)。 –

0

的火力地堡API允许你监听价值变动或对儿童操作。它没有办法倾听grand孩子的变化。

在NoSQL数据库中,您经常需要根据应用程序的使用方式对数据建模。如果我看一下您的具体使用案例:

当通过前端将消息添加到Firebase时,后端需要得到通知才能通过Twilio发送SMS。

我在这里看到的队列:

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并从队列中删除的项目。

+0

感谢您的答案! 'firebase-queue'看起来很有趣,我会检查一下。但是我确实想将这些消息保存在数据库中,所以它不是您列出的队列用例。 –

相关问题