【问题标题】:How do I remove a certain parent node in Firebase based on a child Cloud functions如何根据子云功能删除 Firebase 中的某个父节点
【发布时间】:2021-12-08 11:19:09
【问题描述】:

我目前有这样的数据库结构

我想要做的是能够遍历每个具有特定 feedId 的人,我一直在尝试这种方式,但目前没有运气。有人可以帮忙吗?

function clearAllPostsInOwnFeed(userId) {
  return admin
  .database()
  .ref(constants.FBC_USERS_FEEDS + '/' + userId)
  .once('value')
  .then((snapshot) => {
    snapshot.forEach((snap) => {
      if (snap.child('fromId').val() === userId) return snap.remove()
      return snap
    })
    console.log(snapshot)

    return snapshot
  })
}

【问题讨论】:

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


    【解决方案1】:

    您当前正在从内部回调返回快照。由于这不是一个承诺,它会立即解决 - 您的函数将被终止。在它删除节点之前。


    最简单的解决方法是使用Promise.all() 等待所有删除完成:

    function clearAllPostsInOwnFeed(userId) {
      return admin
      .database()
      .ref(constants.FBC_USERS_FEEDS + '/' + userId)
      .once('value')
      .then((snapshot) => {
        let promises = []
        snapshot.forEach((snap) => {
          if (snap.child('fromId').val() === userId) {
            promises.push(snap.ref.remove())
          }
        })
        return Promise.all(promises);
      })
    }
    

    或者,您可以使用多路径更新通过一次写入擦除所有匹配节点:

    function clearAllPostsInOwnFeed(userId) {
      const ref = admin
      .database()
      .ref(constants.FBC_USERS_FEEDS + '/' + userId);
    
      return ref
      .once('value')
      .then((snapshot) => {
        let updates = {};
        snapshot.forEach((snap) => {
          if (snap.child('fromId').val() === userId) {
            updates[snap.key] = null;
          }
        })
        return ref.update(updates);
      })
    }
    

    【讨论】:

    • 首先,感谢您的评论,第一个非常有魅力,但是我有兴趣使用第二个,唯一的问题是删除整个节点,而不是像第一个一样选择带有 fromId 的少数,我可以在快照上执行 .child('fromId') 并以某种方式仍然引用父级吗?
    • 第二个片段不应该删除整个节点。你确定你打电话给update吗?如果您在此之前console.log(JSON.stringify(updates)),它会显示您希望删除的键吗?
    • 我目前正在返回所有内容,因此节点内的所有内容,而不仅仅是节点,我将在下面粘贴数据。尽管我只想用 fromId === userId 选择几个节点。 { “WeL7Lw17gvYGSPr7eOoMijJHT2P2_-MmZ06VOmWM_3J9R2yQN”:NULL, “WeL7Lw17gvYGSPr7eOoMijJHT2P2_-MmZPbFAHyJKy2Dt6nAF”:NULL, “WeL7Lw17gvYGSPr7eOoMijJHT2P2_-MmZ018onDqvmFGXE6BP”:NULL, “WeL7Lw17gvYGSPr7eOoMijJHT2P2_-MmZ01zrmo86CaWROmBi”:NULL, “WeL7Lw17gvYGSPr7eOoMijJHT2P2_-MmZ0SLcPeyXA_DHtTVT”:NULL, “WeL7Lw17gvYGSPr7eOoMijJHT2P2_-MmZ04_ZXNlFDKdr0EG9”:空}
    • 啊,我修好了!忘记在更新之间添加 if [snap.key] function clearAllPostsInOwnFeed(userId) { const ref = admin.database().ref(constants.FBC_USERS_FEEDS + '/' + userId) return ref.once('value').then ((snapshot) => { let updates = {} snapshot.forEach((snap) => { if (snap.child('fromId').val() === userId) { updates[snap.key] = null } }) 返回 ref.update(updates) }) } 再次感谢弗兰克!
    • 糟糕,这是一个不错的选择。 ? 我也更新了答案中的代码。
    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 2017-03-19
    • 2018-04-14
    • 2018-07-18
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多