2017-10-13 42 views
0

我尝试用它来获取所有10个记录:如何使用Firebase云端功能停止阅读child_added?

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条记录,我需要正确的,即使当新的记录被添加会议这些条款的几天里,这个功能仍然被调用。

当我改变(“child_added到一次(” child_added我只得到1的记录,而不是10.当我改变(“上child_added(”值我得到空的这样的:

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

所以,我怎么能防止函数被调用为未来的变化

回答

2

当你实现云功能的数据库的交互,它是importan? t具有确定性的结束条件。否则,Cloud Functions环境不知道你的代码何时完成,它可能会过早地杀死它,或者让它继续运行(并因此计费)超过必要的时间。

您的代码存在的问题是您附加了一个侦听程序on,然后从不删除它。另外(因为on()没有返回承诺),Cloud Functions不知道你已经完成了。结果是您的听众可能会无限期地活下去。

这就是为什么在大多数使用实时数据库的云端函数中,您将使用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个孩子。

+0

如果我不会limitToFirst(10)它会得到的一切,但永远不会再回到它,直到新的onCreate将是相关的? – user2396640

+0

如果没有'limitToFirst(10)',你会得到**全部**学生匹配查询,但对于每个新创建的类都只有一次(因为这是你触发的)。 –

相关问题