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 上