Firebase 网络将聊天存储为实时数据库中的数组

Posted

技术标签:

【中文标题】Firebase 网络将聊天存储为实时数据库中的数组【英文标题】:Firebase web storing chats as a array in real time database 【发布时间】:2019-08-13 07:24:58 【问题描述】:

我正在尝试使用 firebase 实时数据库制作聊天应用程序。我将 2 个用户之间的聊天作为 JSON 数组存储在 firebase 中。

最初,当用户用来发送消息时,我曾经设置整个聊天数组。但我很快意识到这不是一个好主意,因为数组会增长。

await firebase.database().ref("chats/" + chatId).set(messages)

当我查看官方 documentation 关于如何在 firebase 中处理数组时,我意识到我可以改用 push()。我现在正在做这样的事情:

let messageRef = firebase.database().ref("chats/" + chatId)
await messageRef.push().set(message);

它会导致两个问题,一个是它生成unique keys,另一个是当我获取聊天时它返回JSON object 而不是Array

我想要这样的东西:


在使用 push 之后,我得到了:


实现我想要的最佳方式是什么?

【问题讨论】:

【参考方案1】:

如您所见,调用 push() 将为您生成一个密钥。

两种解决方案:

• 您让 Firebase 为您生成唯一键并在客户端将 JSON 对象转换为数组:

firebase.database().ref("chats/" + chatId).once("value").then(data => 
    console.log(Object.values(data.val()));
);

在此处阅读更多信息https://developer.mozilla.org/fr/docs/Web/javascript/Reference/Objets_globaux/Object/values

• 您使用自己的键(“0”、“1”、“2”...)

firebase.database().ref("chats/" + chatId).child(key).set(msg);

这里的不便之处在于您需要知道密钥。您可以使用 messages.length 或存储一个包含消息大小的新字段(使用 transaction 来增加它)。不要忘记编写规则以防止用户覆盖。

如果可以的话,你应该使用第一个解决方案。

【讨论】:

以上是关于Firebase 网络将聊天存储为实时数据库中的数组的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 实时将数据存储在本地 Room DB 上

在 Swift 中的 Firebase 实时数据库观察方法中具有异步函数的 DispatchGroup

聊天应用中的Firebase实时数据库无法按时检索邮件

从Firebase本地实时存储Room DB上的数据

如何在 Firebase 实时数据库中搜索类似数组的数据?

将坐标存储到 Firebase 中的实时数据库