【问题标题】:Optional messages moderation in Firebase Realtime DB chat?Firebase Realtime DB 聊天中的可选消息审核?
【发布时间】:2021-11-13 13:57:07
【问题描述】:

我正在使用Firebase Realtime DB 实现聊天。有一个要求,有些聊天室默认可以显示新消息,但不同聊天室的消息必须先获得批准才能显示。

Firebase 中的 DB 结构嵌套如下:

/chat/$roomID/$messageID/

每个消息对象的结构如下:

{
    user: string
    content: string
    isApproved: boolean
    clientStamp: number // client-side unix timestamp
    serverStamp: number // server-side unix timestamp, via `firebase.database.ServerValue.TIMESTAMP`
}

只有默认显示的聊天室会很容易 - 我会通过 serverStamp 订购数据:

let query = DBConn.ref('chat/' + roomID).orderByChild('serverStamp').limitToLast(50);
query.on("value", snapshot => {
     // set the list of messages to display
     this.appendSnapshot(snapshot);
});

然而,批准优先规则使这种方法变得困难。显而易见的解决方案是只显示属性isApproved 设置为true 的消息。但是,如果我要查询按时间戳排序的最后 N 条消息,并且有人会发布 N 条未批准的消息,那么这将从查询结果中删除任何已批准的消息,并且聊天将是空的。 Realtime DB有以下限制,无法同时通过时间戳+isApproved查询:

一次只能使用一种排序方式

所以现在我正在通过以下方式解决它:

  • 消息按clientStamp(客户端unix时间戳)而不是serverStamp排序
  • 在向服务器发送新消息时,我将 clientStamp 的值除以 2,这意味着这些新消息永远不会从查询结果中排除已经批准的旧消息(因为它们的时间戳具有更高的值)
  • 当消息被批准时,clientStamp 的值被设置为firebase.database.ServerValue.TIMESTAMP(服务器端时间),这会将其推到聊天查询的顶部 (orderByChild('serverStamp'))

...但这是一个相当快速的解决方法。有什么方法可以让默认显示和批准优先的聊天室都很好地工作?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    我喜欢您将时间戳设置为批准流程的一部分的方法。 ?

    更常见的解决方案是我在Query based on multiple where clauses in Firebase 中记录的解决方案

    这意味着您有一个属性isApproved_serverStamp,您可以在其中存储isApproved 和serverStamp 属性的组合值,例如true_1632065222747。然后,您可以通过以下方式查询最新批准的消息:

    DBConn.ref('chat/' + roomID).orderByChild('isApproved_serverStamp').startAt("true_").limitToLast(50)
    

    【讨论】:

    • hm... 使用.startAt('true_') 肯定会更好,而且该列可以通过规则保护,这与clientStamp 不同。我想我会接受的,谢谢。您是否认为给定列上的索引效率较低,因为现在所有值都基本上以 true_ 开头?
    • 索引效率超出了您的控制范围,但数据库服务器通常可以很好地处理数十万个节点的此类索引。您确实需要实现 query based security rules 以确保用户无法请求未经批准的消息
    • 谢谢,我很欣赏评论的彻底性。我确实考虑了安全规则(这就是我在之前的评论中提到的Rules)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2020-09-10
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多