【问题标题】:Why does this child node not get removed in Firebase Cloud Functions?为什么这个子节点不会在 Firebase Cloud Functions 中被删除?
【发布时间】:2019-03-14 13:10:12
【问题描述】:

我正在尝试在事件节点过期后删除它并删除它的所有子节点 image of the event node before getting removed

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

image of the event node after getting removed

源代码

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()
})

【问题讨论】:

  • 您可能想观看我关于在 Cloud Functions 中处理 Promise 的视频系列。如果你没有正确处理承诺,很多事情会看起来不起作用。 firebase.google.com/docs/functions/video-series
  • 谢谢!!我会看视频!!

标签: javascript node.js firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

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

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

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);
   })
});

【讨论】:

  • 我使用了代码,它有时有效,有时无效。它总是成功删除所有内容,但有时只有嵌套的子“坐标”保留?
  • 我不确定你的意思。你说“它总是成功地删除了一切”,你说“嵌套的孩子”坐标“有时会停留”。你句子的这两部分是对立的……
  • 对不起,我的意思是它总是会成功删除除“坐标孩子”之外的所有内容。该孩子有时会与其他孩子一起被移除,有时不会。
  • 例如:我创建了一个事件,删除函数运行,节点被删除,它下面的所有内容也被删除,但我创建另一个事件,除了嵌套的子“坐标”之外的所有内容都被删除这次依然如此。
  • 通常应该删除所有子元素,如set() 文档中所述:“为新值传递 null 等效于调用 remove();即,此位置的所有数据和所有子位置将被删除。”。但是,我已经通过一些更正更新了答案。你能再试一次吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 2017-10-17
  • 1970-01-01
  • 2019-10-12
  • 2017-09-11
  • 1970-01-01
  • 2018-09-02
相关资源
最近更新 更多