我尝试使用以下方法获取所有 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 个孩子。