如何使用Firebase云功能停止阅读child_added?

时间:2017-10-13 12:47:38

标签: javascript firebase google-cloud-functions

我尝试使用此功能获取所有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条。当我更改时(“child_added < / strong>到 on(“值我在此处获取null:

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

那么如何防止函数被调用以用于将来的更改?

1 个答案:

答案 0 :(得分:2)

在云功能中实施数据库交互时,确定最终条件非常重要。否则,Cloud Functions环境不知道您的代码何时完成,它可能会过早地终止它,或者让它继续运行(从而使您收费)超过必要的时间。

您的代码存在的问题是您使用on附加了一个侦听器,然后永远不会将其删除。此外(由于on()未返回承诺),云函数不知道您已完成。结果是您的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个孩子。