我尝试使用此功能获取所有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");
那么如何防止函数被调用以用于将来的更改?
答案 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个孩子。