【问题标题】:FireStore Transaction: Transaction is not being atomicFireStore 事务:事务不是原子的
【发布时间】:2018-12-09 23:17:20
【问题描述】:

我正在尝试在一个路径上设置一些数据,然后在之前的设置操作成功后尝试从另一个路径中删除数据。对于我正在使用 FireStore 事务。以下是代码。

const unapprovedItemRef = admin
  .firestore()
  .collection("unapproved")
  .doc(id);

return admin.firestore().runTransaction(transaction =>
  transaction
    .get(unapprovedItemRef)
    .then(unapprovedItemSnapshot => {
      const item = unapprovedItemSnapshot.data();
      if (!item) {
        throw new Error("No such item");
      }

      const data = {
        added_on: new Date()
      };

      const dataRef = admin
        .firestore()
        .collection("data")
        .doc('saved');

      return transaction.set(dataRef, data);
    })
    .then(() => transaction.delete(unapprovedRef)) // deliberate error
    .then(() =>
      res.status(200).send({
        message: "Success"
      })
    )
    .catch(err =>
      res.status(200).send({
        message: "Failed",
        error: err.message
      })
    )

问题是,事务的delete 操作失败(因为我故意在其中引入了一个错误)但set 操作仍然成功,因为它也应该失败,因为它只是逻辑事务的一半。

我在这里做错了什么?

【问题讨论】:

    标签: javascript firebase google-cloud-firestore firebase-admin


    【解决方案1】:

    由于您附加了自己的 .catch 块,Firestore 不知道您的交易失败。您的 catch 块将 throw new Error("No such item") 转换为一个成功的 Promise,Firestore 使用它来提交您的事务。

    此外,transaction.delete() 行永远不会被执行,因为前一个块失败了。如果将此行移到 catch 块之后,也会导致事务失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多