0

我遇到了对Firebase函数事件缺乏理解的情况。为了使我的功能按预期工作,我为参考路径增加了更多的特殊性,然后我认为这是必需的。Firebase函数onCreate()onDelete()路径特异性

例如,我想增加或孩子被添加到或从该路径删除每次计数递减:

/invites

我用这些作为我的功能来实现:

functions.database.ref('/invites').onCreate(event => { 
    return admin.database().ref('/counter').transaction((current) => { 
    return (current || 0) + 1; 
    }) 
}); 

functions.database.ref('/invites').onDelete(event => { 
    return admin.database().ref('/counter').transaction((current) => { 
    if (current >=1) return (current - 1); 
    else return; 
    }) 
}); 

This是我根据我的路径:

路径规范匹配所有触及路径的写入,包括发生在其下的任何写入。

/富/酒吧

/富/酒吧/巴兹/真的/深/路径

:如果您设置的路径为你的功能/富/酒吧,它在这两个位置的匹配事件

在我的情况下,/invites将等于该例子中的/bar

但是,上述功能只会触发第一个孩子被添加到/invites以及最后一个孩子被删除。在这两种情况之外,其他任何事情都不会触发计数器功能。我已经能够使这项工作的唯一方法是通过使用这个作为我的路径:

invites/{idOfInvite}

虽然我知道这会工作,我不知道,这正是我需要的。稍后我可能会决定在某个{idOfInvite}的路径下添加新的数据,这会导致我的计数器函数触发(我认为?)。

这个SO answer表示我的函数的行为是预期的,但这不是我期望基于我对文档的理解。也许我错误地解释了文档?

正如你所看到的,我对这些添加/删除事件如何触发的理解有些偏离。

回答

4

onCreate只有在数据库中新创建给定路径时才会被调用。如果路径已经存在(即它已经有一个孩子),那么添加另一个孩子不是该路径上的“创建”事件。这是一个更新事件。所以,如果你的函数使用了onUpdate,那么只要写入该路径下的任何东西,它就会被触发。

您使用的onCreate/onDelete在/invites/{id}对您的用例是正确的,因为它有效地要求在新创建或删除/invites的任何单个子项时被调用。