【发布时间】:2021-12-19 12:08:38
【问题描述】:
我对 Firebase 和 NoSQL 数据库很陌生,我正在开发服务器端。
我的目标是在一个事务中读取两个集合(并锁定包含的文档以保持一致性)。一方面,我想从集合 A 中读取多达 499 个文档,另一方面,我想从集合 B 中读取一个文档,如以下代码示例所示。
export const transactionTest = function(nextFunction: () => void) {
const collection_A_reference = admin.firestore().collection("A").limit(499);
const collection_B_doc_B1_reference = admin.firestore().collection("B").doc("B1");
try {
admin.firestore().runTransaction((t) => {
return t.get(collection_A_reference)
.then((coll_A_snapshot) => {
if (!(coll_A_snapshot.empty)) {
t.get(collection_B_doc_B1_reference)
.then((coll_B_doc_B1_snapshot) => {
if (coll_B_doc_B1_snapshot.exists) {
let counter = coll_B_doc_B1_snapshot.get("COUNTER");
for (let i = 0; i < coll_A_snapshot.docs.length; i++) {
counter++;
t.update(coll_A_snapshot.docs[i].ref, {COUNTER: counter});
}
t.update(coll_B_doc_B1_snapshot.ref, {COUNTER: counter});
} else {
console.log("coll_B_doc_B1_snapshot does not exist");
}
});
} else {
console.log("coll_A_snapshot is empty");
}
});
});
} catch (e) {
console.log("Transaction failure:", e);
nextFunction();
}
nextFunction();
};
但是,似乎 第二个 t.get 是不允许的 并抛出以下错误:
(node:13460) UnhandledPromiseRejectionWarning: 错误: 10 ABORTED: 引用的事务已过期或不再有效
有人知道如何实现(尤其是在语法上)吗?我用谷歌搜索了很多,但我没有找到我想要的。也许我在推理如何在firebase中使用事务时也有错误。一种解决方法可能是在事务之前创建一个DocumentReferences 数组,然后使用它transaction.getAll(),但这看起来不是很优雅。
我会感谢任何帮助:)
最好的问候
【问题讨论】:
标签: javascript firebase google-cloud-firestore firebase-admin