如何使用 Firebase 规则从一侧删除消息?

Posted

技术标签:

【中文标题】如何使用 Firebase 规则从一侧删除消息?【英文标题】:How to delete message from one side using firebase rules? 【发布时间】:2021-05-06 12:16:17 【问题描述】:

我在聊天应用程序上工作一对一聊天,我的数据库结构是

"rules": 
    "Messages" :
      "$chatId" : 
        ".read": "root.child('Chat_members').child(chatId).child(auth.uid).exists()",
        ".write": "root.child('Chat_members').child(chatId).child(auth.uid).exists()"
      

我想实现删除消息,所以如果 user1 删除消息,我将隐藏它并仅为 user2 显示它,我可以从客户端执行此操作,但是请求所有数据的方法非常低效,例如只有一条消息这将为 user1 显示如何从 firebase 规则执行此操作?我能找到任何帮助吗?

【问题讨论】:

我不确定这个问题是否清楚,但这听起来你只需要添加一个 isVisible 标志,并且只读取 isVisible == true 或非规范化数据的消息,因此有两组,一组用于每个用户,如果用户 1 删除了一条消息,则将其从他的“可见消息”中删除,但将其保留在用户 2 的“可见消息”中 @Jay 照顾性能的最佳方法是什么? 这两种解决方案都不应该对性能产生影响——事实上,减少读取的节点数量实际上会更快。话虽如此,Firebase 的启动速度非常快,因此很可能不会对性能产生任何影响。 @Jay 你的意思是我必须为可见性添加一个节点,如果可见性是真的,我会为每条消息检查这个,我会显示消息。这会检查每条消息会减慢消息的显示速度并影响性能吗? 嗯。不,这不是我的评论所说的。您将添加一个子节点 isVisible,并且只读取具有 isVisible == true 的节点。因此,如果有 1000 个节点并且用户“删除”其中的 900 个(顺便说一句,这也称为“软删除”),这些节点的 isVisible 将设置为 false,因此它们不再出现在 UI 中。查询只会读取 isVisible == true 的节点。 【参考方案1】:

正如文档所说security rules don't filter data。相反,您需要确保客户端只读取您要显示的数据。

我没有看到一种简单的方法可以在不添加更多数据的情况下对您的结构执行此操作。事实上,我能想到的最简单的方法是简单地为每个用户复制聊天,然后在需要时从他们的数据结构中实际删除消息。

【讨论】:

这种方式比在我的客户端过滤数据更好,还是有另一种结构可以处理这个问题? @Frank van Puffelen 不一定更好,只是针对不同需求的不同方法。 结构怎么样,还有其他结构可以处理吗? @Frank van Puffelen 我已经在我的回答中给出了一个结构。 ¯\_(ツ)_/¯

以上是关于如何使用 Firebase 规则从一侧删除消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 URL 中删除 Firebase 存储文件

如何使用 Flutter 和 Firebase 为聊天应用制定规则

用于 uid 列表的 Firebase 存储自定义元数据安全规则

用户注销 React Native 应用程序时如何删除 Firebase 云消息传递令牌?

火力基地规则有问题

如何在不点击通知的情况下从通知中获取数据(firebase 云消息传递和本机反应)