首页 > 解决方案 > 如何根据子云功能删除 Firebase 中的某个父节点

问题描述

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

我想要做的是能够遍历每个具有特定 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
  })
}

标签: javascriptnode.jsfirebasegoogle-cloud-functions

解决方案


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


最简单的修复方法是使用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);
  })
}

推荐阅读