我正在云功能上进行部署,并且出现此错误
Error: Cannot modify a WriteBatch that has been committed.
at WriteBatch.verifyNotCommitted (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/write-batch.js:112:19)
at WriteBatch.update (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/write-batch.js:299:14)
at Transaction.update (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/transaction.js:225:33)
at transaction.get.then (/user_code/index.js:22:40)
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
下面是我的代码,我正在使用事务在Firestore上进行更新和删除。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const firestore = admin.firestore();
exports.updateUserSize = functions.auth.user().onDelete((user) => {
var userDocRef = firestore.collection("users").where('uid', '==',
user.uid).limit(1);
return firestore.runTransaction(function(transaction) {
return transaction.get(userDocRef).then((snapshot) => {
snapshot.forEach(userDoc => {
if (!userDoc.exists) {
throw "userDoc does not exist!";
}
console.log("user_uid: " + userDoc.data().uid + " | instanceDocId: " + userDoc.data().instance);
var instanceDocRef = firestore.collection("utils").doc(userDoc.data().instance);
return transaction.get(instanceDocRef).then((snapshot) => {
console.log("snapshotn: " + snapshot.data().user_size);
var newUserSize = snapshot.data().user_size - 1;
transaction.update(instanceDocRef, { user_size: newUserSize });
});
});
});
}).then(function() {
console.log("Transaction successfully committed!");
}).catch(function(error) {
console.log("Transaction failed: ", error);
});
});
我们将不胜感激任何帮助。
答案 0 :(得分:0)
这是通过使用for循环解决的,如@Renaud Tarnec在评论中所述。
我认为您的问题来自以下事实:您多次将
transaction
返回到forEach
循环中。同样,您在执行transaction.update(instanceDocRef, { user_size: newUserSize });
时也不会返回交易。谨建议您详细研究文档:https://firebase.google.com/docs/firestore/manage-data/transactions和https://firebase.google.com/docs/reference/js/firebase.firestore.Transaction。在forEach
循环中,我认为您没有遵循约束:“事务由任意数量的get()操作组成,紧随其后的是任意数量的写操作,例如set(), update()或delete()。“