如何使用 Firebase 云函数停止读取child_added



我尝试使用以下方法获取所有 10 条记录:

exports.checkchanges = functions.database.ref('school/{class}').onCreate(snap => {
    const class=snap.params.class;
    var ref = admin.database().ref('/students')
    return ref.orderByChild(class).startAt('-').on("child_added", function(snapshot) {
        const age=snapshot.child("age");
        // do the thing
    })
)}

问题是,在我正确获得所需的 10 条记录后,即使在几天后添加了符合这些术语的新记录,仍然会调用此函数。

当我将 on("child_added 更改为一次("child_added时,我只得到 1 条记录而不是 10 条记录。当我将 on("child_added 更改为 on("值时,我对此为空:

const age=snapshot.child("age");

那么,如何防止将来调用该函数进行更改呢?

在 Cloud Functions 中实现数据库交互时,具有确定性的结束条件非常重要。否则,Cloud Functions 环境不知道您的代码何时完成,并且它可能会过早终止它,或者让它运行(从而向您计费)的时间超过必要的时间。

代码的问题在于,您将侦听器附加到on,然后永远不会将其删除。此外(因为on()不返回承诺),Cloud Functions 不知道你已经完成了。结果是,您的on()听众可能会无限期地活着。

这就是为什么在使用实时数据库的大多数云函数中,您会看到它们使用 once() .为了让所有孩子都once(),我们将收听value事件:

exports.checkchanges = functions.database.ref('school/{class}').onCreate(snap => {
    const class=snap.params.class;
    var ref = admin.database().ref('/students')
    return ref.orderByChild(class).startAt('-').limitToFirst(10).once("value", function(snapshot) {
      snapshot.forEach(function(child) {
        const age=child.child("age");
        // do the thing
      });
    })
)}

我添加了一个limitToFirst(10),因为您指出您只需要 10 个孩子。

相关内容

  • 没有找到相关文章

最新更新