【问题标题】:Sending push notification on firestore document field change发送有关 Firestore 文档字段更改的推送通知
【发布时间】:2019-11-02 08:40:14
【问题描述】:

我有一个 Flutter 应用程序,它允许用户通过 Firestore RTDB 互相租用物品。在我的租赁文件中,我有一个字段status 来确定租赁的状态(将其想象为运送物品,其中物品的状态可以是“已订购”、“已发货”、“已交付”等)。我的status变量是0到5之间的一个数字,每个数字代表一个不同的阶段。当status 变量发生变化时,我想通过推送通知通知租赁中的其他用户。但我不知道以下哪种方法最好。

  1. 第一种方法是使用每次更新租赁文件时触发的云功能。但我只检查status 字段。它看起来像这样:

    exports.notify = functions.firestore.document('rentals/{rentalId}')
    .onUpdate(async (snapshot, context) => {
        const oldSnap = snapshot.before.data(); // previous document        
        const newSnap = snapshot.after.data(); // current document       
    
        // status changes from 0 to 1
        if (oldSnap.status === 0 && newSnap.status === 1) {
            // do something
        }
    })
    

    我能想到的一个缺点是我必须再次读取才能获取其他用户的设备推送令牌。此外,每次租赁文件更新都会触发此云功能,最终可能甚至不需要首先执行

  2. 另一种方法是拥有一个存储通知的notifications 集合,并拥有一个在添加新通知文档时触发的云功能。然后,在客户端,当用户点击一个按钮时,更新租赁中的status,并创建一个新的通知文档。

    Firestore.instance
        .collection('rentals')
        .document(rentalId)
        .updateData({'status': newStatus});
    
    Firestore.instance.collection('notifications').add({
      'title': title,
      'body': body,
      'pushToken': <TOKEN HERE>,
    });
    

    与方法 1 相比,这会进行额外的写入而不是读取。

哪种方法更好?

【问题讨论】:

  • 你有什么问题?
  • 哪种方法更好

标签: node.js google-cloud-firestore firebase-cloud-messaging google-cloud-functions


【解决方案1】:

这两种方法在技术上都可行且有效。您选择哪一个取决于用例,并且(鉴于两者都可以在这里工作)取决于个人喜好。这就是为什么我将在下面简单地强调一些关键差异,并解释我个人何时选择使用哪一个。

您描述的第一种方法是将数据库视为状态机,其中每个状态和状态转换都有特定的含义。然后,您可以使用 Cloud Functions 在状态转换中触发代码。

第二种方法将数据库视为一个队列,其中数据的存在表明需要发生什么。因此,Cloud Functions 会在文档的简单存在时触发。

我通常使用基于队列的方法进行生产工作,因为它可以很容易地查看还有多少工作要做。 notifications 集合中的任何内容都是需要发送的通知。

在状态转换数据模型中,要轻松查看此信息要困难得多。事实上,您需要在文档中添加额外的字段才能获得此“待处理通知”列表。例如:带有待处理通知的出租是状态从 0 更改为 1 的时间戳(您需要添加的字段,例如 status_1_timestamp)小于上次发送通知的时间戳(如notification_timestamp)。

但我有时也会使用状态转换方法。通常当我想转换现有文档时,或者因为它只是一个很酷的用例来展示(因为在大多数情况下,Firebase/Firestore SDK 不会同时公开旧状态和新状态)。

我可能会在这里选择基于队列的方法,但如前所述:根据上述推理,这是我的个人偏好。如果这些原因不适用于您,或者您有不同的原因,那也可以。

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多