仅使用firebase

时间:2017-08-18 04:29:21

标签: javascript firebase

我使用Firebase获取邮件列表。问题是我只需要在打开页面后看到发送的消息。基本上我不需要将消息存储在数据库中,我只需要将消息广播到所有连接的设备。

ref.limitToLast(1).on('child_added', function(snapshot) {
    console.log(snapshot.name(), snapshot.val());
});

上面的代码正确地返回了最后一个孩子但我正在用我不需要的消息填充我的数据库。什么时候删除“旧”消息?

2 个答案:

答案 0 :(得分:1)

我不建议删除旧邮件,而不是让每个用户都只阅读新内容。

如果您的数据结构有效,那么您只需要为模型添加1个属性。每次发送消息时,都会在属性中为其添加时间戳。

Here is the doc how to use the ServerValue.TIMESTAMP

现在每个消息节点都可以按时间戳排序。

"messages": {
    "chat_1": {
        "push_key_usually":{
         "message": "hello",
         "owner": "maybe the UID or the email",
         "chat_key": "chat_1",
         "key": "push_key_usually",
         "timestamp": 981212312
         }
    }
}

要完成此操作,您需要让每个用户在加载聊天时设置自己的时间戳。这样,您可以从数据库中获取该值,并使用该时间戳对您的消息进行排序。完整的顺序是首先查询值,如果它是null,那么这是第一次,只需使用自定义时间戳(可以是零或当前时间减去几分钟)询问每条消息或工作并设置值。如果它不为null,则将该值用于查询,并在获得后再次设置时间戳。

"connections": {
    "user_UID": 12312412
}

现在你可以这样做:

reference.child("messages/chat_1/push_key_usuarlly").orderByChild("timestamp").startAt(yourTimeStamp).once...

答案 1 :(得分:0)

Firebase数据库不是消息传递机制,它是一种状态同步机制。如果您希望可以模拟数据库上的消息传递机制,但您必须为此工作。

实现此目的的一种方法是为要将其发送到的每个设备编写消息。这意味着每个设备都可以简单地删除它读取的每条消息,并且您的数据库永远不会大于未读消息设备的总数。

另一种方法是仅存储每条消息一次,然后跟踪哪些设备已读取它。每个设备读取后,您都可以删除该消息。您需要在数据库中存储“哪些设备已读取每条消息”和“所有设备列表”。这种方法可能需要更少的存储空间,但在代码中肯定会更复杂。