首页 > 解决方案 > 为什么这个子节点没有在 Firebase Cloud Functions 中被删除?

问题描述

我正在尝试在事件节点过期后删除它,并 在删除之前删除事件节点的所有子图像

问题是当时间过去了,我删除了事件节点,除了这个孩子之外,它的所有孩子都被删除了

移除后事件节点的图像

源代码

exports.removeOldEvents = functions.https.onRequest((req, res) => {
const eventsRef = admin.database().ref('events')
eventsRef.once('value', (snapshot) => {
    snapshot.forEach((child) => {
        child.forEach((child) => {
            if (1000*Number(child.val()['endDate']) <= new Date().getTime()) {
                child.ref.set(null)
          }
        })
    })
})
return res.status(200).end()
})

标签: javascriptnode.jsfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


由于您多次调用该set()方法,该方法返回一个承诺,因此您应该使用Promise.all()以等待所有承诺解决,然后再发回响应。

您的代码的以下改编应该可以工作(但是未经测试):

exports.removeOldEvents = functions.https.onRequest((req, res) => {
   const eventsRef = admin.database().ref('events')

   eventsRef.once('value')
   .then((snapshot) => {
      const promises = [];
      snapshot.forEach((child) => {
          child.forEach((child) => {
              if (1000*Number(child.val().endDate) <= new Date().getTime()) {
                  promises.push(child.ref.set(null));
              }
          });
      });
      return Promise.all(promises);
   })
   .then(results => {
      const responseObj = {response: 'success'};
      res.send(responseObj);
   })
   .catch(err => {
      res.status(500).send(err);
   })
});

推荐阅读