В приведенном выше комментарии Андре показано, как удалить узел complete
, а не его родительский элемент.
Однако ваш код облачной функции не учитывает тот факт, что вынеобходимо дождаться завершения асинхронных задач (все вызовы set(null)
, который возвращает Promise, который «разрешается после завершения записи на сервер»), прежде чем отправить ответ с return res.status(200).end();
,
Если вы этого не сделаете, ваша облачная функция может завершить до того, как будут выполнены асинхронные задачи (и некоторые complete
узлы могут быть не удалены).В первых двух видеороликах о «Обещаниях JavaScript» из серии видеороликов Firebase вы найдете несколько подробных объяснений: https://firebase.google.com/docs/functions/video-series/
Итак, вам нужно подождать, пока все Обещания возвращаются асинхронными set()
задачами.решить, вам нужно использовать Promise.all
и адаптировать свой код следующим образом:
exports.removeOldMessages = functions.https.onRequest((req, res) => {
const timeNow = Date.now();
const usersRef = admin.database().ref('/users');
usersRef.once('value')
.then(snapshot => {
const promises = [];
snapshot.forEach((child) => {
if ((Number(child.val()['complete'])) <= timeNow) {
promises.push(child.ref.child('complete').set(null));
}
});
return Promise.all(promises);
})
.then(results => {
return res.status(200).end();
})
.catch(error => {
//Watch the official video https://www.youtube.com/watch?v=7IkUgCLr5oA
})
});