Node.js 发送firestore文档字段更改推送通知

Node.js 发送firestore文档字段更改推送通知,node.js,google-cloud-firestore,firebase-cloud-messaging,google-cloud-functions,Node.js,Google Cloud Firestore,Firebase Cloud Messaging,Google Cloud Functions,我有一个Flitter应用程序,允许用户通过Firestore RTDB相互租用物品。在我的租赁文档中,我有一个字段status,用于确定租赁的状态(将其视为装运项目,其中项目的状态可以为“已订购”、“已装运”、“已交付”等)。Mystatus变量是一个介于0和5之间的数字,每个数字代表一个不同的阶段。当状态变量更改时,我想用推送通知通知租赁中的其他用户。但我不知道以下哪种方法是最好的 第一种方法是使用云函数,该函数在每次更新租赁文档时都会触发。但我只检查状态字段。它看起来像这样: export

我有一个Flitter应用程序,允许用户通过Firestore RTDB相互租用物品。在我的租赁文档中,我有一个字段
status
,用于确定租赁的状态(将其视为装运项目,其中项目的状态可以为“已订购”、“已装运”、“已交付”等)。My
status
变量是一个介于0和5之间的数字,每个数字代表一个不同的阶段。当
状态
变量更改时,我想用推送通知通知租赁中的其他用户。但我不知道以下哪种方法是最好的

  • 第一种方法是使用云函数,该函数在每次更新租赁文档时都会触发。但我只检查
    状态
    字段。它看起来像这样:

    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
        }
    })
    
    我能想到的一个缺点是,我必须进行另一次读取才能获得另一个用户的设备推送令牌。此外,对于每次租赁文档更新,都会触发此云功能,最终可能根本不需要执行

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

    Firestore.instance
        .collection('rentals')
        .document(rentalId)
        .updateData({'status': newStatus});
    
    Firestore.instance.collection('notifications').add({
      'title': title,
      'body': body,
      'pushToken': <TOKEN HERE>,
    });
    
    Firestore.instance
    .收款(“租金”)
    .文件(rentalId)
    .updateData({'status':newStatus});
    Firestore.instance.collection('notifications')。添加({
    “标题”:标题,
    “身体”:身体,
    “pushToken”:,
    });
    
    与方法1相比,这会进行额外的写入而不是读取


  • 哪种方法更好?

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

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

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

    Firestore.instance
        .collection('rentals')
        .document(rentalId)
        .updateData({'status': newStatus});
    
    Firestore.instance.collection('notifications').add({
      'title': title,
      'body': body,
      'pushToken': <TOKEN HERE>,
    });
    
    我通常使用基于队列的方法进行生产工作,因为这样可以很容易地看到还有多少工作要做。
    通知
    集合中的任何内容都是需要发送的通知

    在状态转换数据模型中,很难轻松查看这些信息。事实上,您需要向文档中添加额外的字段,以便能够获取此“待定通知”列表。例如:具有挂起通知的租用是指状态从0更改为1的时间戳(您需要添加的字段,例如
    status\u 1\u timestamp
    )小于上次发送通知的时间戳(类似
    notification\u timestamp
    的字段)的租用

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


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

    你的问题是什么?哪种方法更好