云功能-防止某些字段触发

时间:2020-04-10 12:51:25

标签: javascript firebase google-cloud-firestore google-cloud-functions

我有一个应用程序,人们可以请求食物,然后有订单,每个订单都有该订单的状态,因此我创建了一个函数,该功能将在每次该订单的状态更改时发送用户通知,状态可以是由接受订单的商店和完成订单时的用户更改。

但是我想将此功能的执行限制为userId和status字段这两个字段,因为现在有了onUpdated,只要对此文档进行更新,此触发器将始终启动。

我打算为此文档更新uid和status以外的其他字段,并且我不想再次触发该触发器并在不需要时向用户发送通知。

总有限制文档中某些字段的触发器吗?

exports.onOrderUpdated = functions.firestore
.document('orders/{orderId}').onUpdate((change, context) => {

    var db = admin.firestore();

    try{
        const orderDataSnap = change.after.data();
        var userId = orderDataSnap.uid;
        var orderStatus = orderDataSnap.status;
    }catch(error){
        return handleErrorToUser(error);
    }

这里,我只想在该文档中的userId和状态更改时执行此功能

反正有这样做吗?

谢谢

2 个答案:

答案 0 :(得分:3)

根据Change的文档,有beforeafter snapshots

您可以分别对其中的每个调用data()方法,并检查副本前后的userIdstatus是否相等。如果是这样,请尽早退出该功能。

答案 1 :(得分:2)

没有,仅当文档的某些特定字段发生更改时,才不可能触发“云功能”。正如samdy1在他的回答中所解释的,您可以在Cloud Function中检测到哪些字段已更改,但对于需要触发Cloud Function

一种解决方案是与更改并行地将文档写入另一个专用集合。

例如,如果您要使用新的status更新文档,则将文档写入具有父订单文档ID和状态值的集合statusUpdates,并触发一个基于此文档创建的Cloud Function。

当然,这意味着创建文档并且要付出一定的代价(除了CF触发)。您可以根据更新的频率来进行数学计算,以计算这种方法是否比为订单文档无条件触发Cloud Function的方法便宜。