Firebase函数onCreate()onDelete()路径特异性

时间:2017-08-27 17:00:07

标签: javascript firebase firebase-realtime-database google-cloud-functions

我对Firebase功能事件缺乏了解。为了使我的功能按预期工作,我在参考路径中添加了更多特异性,然后我认为是必需的。

例如,我希望每次在此路径中添加或删除子项时递增或递减计数:

/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是我的基础:

  

路径规范匹配触摸路径的所有写入,包括发生在其下方任何位置的写入。如果将函数的路径设置为/ foo / bar,则它会匹配以下两个位置的事件:

     

/富/酒吧

     

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

在我的情况下,/invites在该示例中等同于/bar

但是,上述功能仅触发添加到/invites的第一个孩子以及被删除的最后一个孩子。在这两个条件之外,其他任何东西都不会触发计数器功能。我能够完成这项工作的唯一方法是使用它作为我的路径:

invites/{idOfInvite}

虽然我知道这会起作用,但我不知道这正是我需要的。后来我可能决定在某个{idOfInvite}的路径下添加新数据,这会导致我的计数器功能被激活(我想?)。

这个SO answer表示我的函数的行为是预期的,但根据我对文档的理解,它不是我所期望的。也许我正在错误地解释文档?

正如您所知,我对这些添加/删除事件触发方式的理解有些不同。

1 个答案:

答案 0 :(得分:5)

仅当在数据库中新创建给定路径时,才会调用

onUpdate。如果路径已经存在(即,它已经有一个子节点),那么添加另一个子节点不是该路径上的“创建”事件。这是一个更新事件。因此,如果您的函数使用/invites/{id},则只要该路径下的任何内容被写入,它就会被触发。

您在/invites使用onCreate / onDelete对于您的用例是正确的,因为当新创建或删除--- title: My Post author: JeanJouX date: 2016-09-06 tags: Haskell description: The teaser of my post to be shown in the RSS feed. Not in the full page. --- The rest of the post to be shown in the full page of my website 的任何单个子项时,它实际上要求被调用。