Я пытаюсь установить некоторые данные по одному пути, а затем пытаюсь удалить данные из другого после успешного выполнения ранее установленной операции. Для этого я использую транзакции 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 [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку вы прикрепили свой собственный блок .catch, Firestore не знает, что ваша транзакция не удалась. Ваш блок catch преобразует throw new Error("No such item") в успешное обещание, которое Firestore использует для фиксации вашей транзакции.
Более того, строка transaction.delete() никогда не выполняется, поскольку предыдущий блок не удался. Если вы переместите эту строку сразу после блока catch, это также должно привести к сбою транзакции.