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

skw*_*wny 0 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;
  })
});
Run Code Online (Sandbox Code Playgroud)

就是我的基础:

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

/富/酒吧

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

在我的情况下,/invites将相当于/bar该示例.

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

invites/{idOfInvite}

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

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

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

Dou*_*son 5

onCreate只有在数据库中新创建给定路径时才会调用.如果路径已经存在(即,它已经有一个子节点),那么添加另一个子节点不是该路径上的"创建"事件.这是一个更新事件.因此,如果您的函数正在使用onUpdate,则只要在该路径下写入任何内容,它就会被触发.

您对onCreate/onDelete at的/invites/{id}使用对于您的用例是正确的,因为当/invites新创建或删除任何单个子项时,它实际上要求被调用.