无法修改已在云功能中提交的WriteBatch

时间:2018-08-24 19:05:51

标签: node.js firebase transactions google-cloud-firestore google-cloud-functions

我正在将此代码部署到云函数上,无法修改已提交的WriteBatch,我已经在获取每个集合后尝试提交,但这不是正确的方法,而且不一致,尝试了几个小时后无法发现错误。同样,代码在冷启动后第一次运行时,此帖子也有同样的问题Batch write to firebase cloud firestore,在哪里创建

  

每组写操作都有一个新批处理。   在这段代码中。

 var batch = db.batch();
      db.collection("myposts")
        .doc(post_id)
        .collection("fun")
        .get()
        .then(snapshot => {
          return snapshot.forEach(doc => {
            batch.delete(doc.ref);
          });
        })
        .then(
          db
            .collection("relations_new")
            .where("uid", "==", uid)
            .get()
            .then(snapshot => {
              return snapshot.forEach(doc => {
                batch.delete(doc.ref);
              });
            })
        )
        .then(
          db
            .collection("relation")
            .where("uid", "==", uid)
            .get()
            .then(snapshot => {
              return snapshot.forEach(doc => {
                batch.delete(doc.ref);
              });
            })
            .catch(err => {
              console.log(err);
            })
        )

        .then(
          db
            .collection("posts")
            .doc(post_id)
            .get()
            .then(snap => {
              return batch.delete(snap.ref);
            })
            .then(batch.commit())
        )
        .catch(err => {
          console.log(err);
        });`

1 个答案:

答案 0 :(得分:2)

确保从您的then函数返回承诺,并最终从您的云函数返回承诺。 ESLint是捕获此类错误的好工具。


  let batch = db.batch();
  return db.collection("myposts").doc(post_id)
    .collection("fun").get()
    .then(snapshot => {
      snapshot.forEach(doc => {
        batch.delete(doc.ref);
      });

      return null;
    })

    .then(() => {
      return db.collection("relations_new")
        .where("uid", "==", uid)
        .get();
    })

    .then(snapshot => {
      snapshot.forEach(doc => {
        batch.delete(doc.ref);
      });

      return null;
    })

    .then(() => {
      return db.collection("relation")
        .where("uid", "==", uid)
        .get();
    })

    .then(snapshot => {
      snapshot.forEach(doc => {
        batch.delete(doc.ref);
      });

      return null;
    })

    .then(() => {
      return db.collection("posts").doc(post_id).get();
    })

    .then(snap => {
      batch.delete(snap.ref);
      return null;
    })

    .then(() => {
      return batch.commit();
    })

    .then(() => {
      console.log("Success");
      return null;
    })

    .catch(err => {
      console.log(err);
    });