Node.js 发送firestore文档字段更改推送通知
我有一个Flitter应用程序,允许用户通过Firestore RTDB相互租用物品。在我的租赁文档中,我有一个字段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
status
,用于确定租赁的状态(将其视为装运项目,其中项目的状态可以为“已订购”、“已装运”、“已交付”等)。Mystatus
变量是一个介于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不会同时显示新旧状态)
我可能会在这里选择基于队列的方法,但如前所述:基于上述推理,这是我个人的偏好。如果这些原因不适用于你,或者你有不同的原因,那也可以。你的问题是什么?哪种方法更好