【问题标题】:Cloud Functions - Preventing triggers on certain fieldsCloud Functions - 防止在某些字段上触发
【发布时间】:2020-04-10 12:51:25
【问题描述】:

我有一个人们可以要求食物的应用程序,然后我有订单,每个订单都有该订单的状态,所以我制作了一个功能,每次该订单的状态发生变化时都会向用户发送通知,状态可以是由接受订单的商店和用户在订单完成时更改。

但我想将此函数的执行限制为仅 2 个字段,即 userId 和 status 字段,因为现在我有 onUpdated,每当对此文档进行更新时,此触发器将始终启动。

我计划更新此文档的 uid 和状态以外的其他字段,并且我不希望触发器再次重新启动并在不需要时向用户发送通知。

有没有办法通过文档中的某些字段来限制触发器?

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和状态发生变化时才执行此功能

有没有办法做到这一点?

谢谢

【问题讨论】:

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


    【解决方案1】:

    根据Change的文档,有before和aftersnapshots。

    您可以在其中的每一个上调用data() 方法,并检查userId 和status 在前后副本中是否相等。如果是,请尽早退出函数。

    【讨论】:

    • 非常感谢您的宝贵时间!
    【解决方案2】:

    不,只有在文档的某些特定字段发生更改时才可能触发云函数。正如 samdy1 在他的回答中所解释的那样,您可以在 Cloud Function 中检测到哪些字段已更改,但为此需要触发 Cloud Function。

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

    例如,如果您正在使用新的status 更新文档,则将文档写入集合statusUpdates,并使用父订单文档的 ID 和状态值,然后触发基于此文档创建。

    当然,这意味着创建文档并且需要成本(除了 CF 触发)。您可以根据更新的频率进行数学计算,以计算这种方法是否会比触发订单文档的云函数的方法更便宜。

    【讨论】:

    • 非常感谢您抽出宝贵时间 Renaud,我接受了每次回答的第一个答案
    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2013-08-28
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多