gpt4 book ai didi

node.js - 发送有关 firestore 文档字段更改的推送通知

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:55 26 4
gpt4 key购买 nike

我有一个 Flutter 应用程序,允许用户使用 Firestore RTDB 互相租用元素。在我的租赁文档中,我有一个字段 status 来确定租赁的状态(可以将其想象为运送元素,其中元素的状态可以为“已订购”、“已运送”、“已交付” ETC)。我的 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
    }
    })

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

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

    Firestore.instance
    .collection('rentals')
    .document(rentalId)
    .updateData({'status': newStatus});

    Firestore.instance.collection('notifications').add({
    'title': title,
    'body': body,
    'pushToken': <TOKEN HERE>,
    });

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

哪种方法更好?

最佳答案

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

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

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

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

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

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

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

关于node.js - 发送有关 firestore 文档字段更改的推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56670511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com