FireStore 事务:事务不是原子的



我正在尝试在一个路径上设置一些数据,然后在先前的设置操作成功后尝试从另一个路径中删除数据。对于我正在使用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操作仍然成功,因为它只是逻辑事务的一半。

我在这里做错了什么?

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

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

最新更新