Я пытаюсь выполнить транзакцию в облачной функции, чтобы перебрать массив, чтобы увеличить пользовательское поле crowns
в облачном хранилище пожаров.В настоящее время транзакция работает только для первого пользователя и без последующих пользователей (или DocumentReferences)
Я попытался изменить возврат для деталей .runTransaction
, а также попытался изменить некоторые обещания.Я использую https://firebase.google.com/docs/firestore/manage-data/transactions для справки.
exports.crowns_job =
functions.pubsub.topic('comments-tick').onPublish((event) => {
var uids = [];
var uids1 = [];
//var crownVal = 0;
admin.firestore().collection('winners').get().then(function(querySnapshot) {
if (querySnapshot.size > 0) {
// Contents of first document
//console.log(querySnapshot.docs[0].data());
for (i = 0; i < querySnapshot.size; i++){
if (querySnapshot.docs[i].id != "uids"){
uids[i] = querySnapshot.docs[i].data().uid; //new individual uids from winners
console.log(uids)
console.log("holyyyy" + querySnapshot.docs[i].data().uid)
}
}
admin.firestore().doc('winners/uids').get().then(function(doc) {
if (doc.exists) {
uids1 = doc.data().uids //old uids
console.log("uids///" + uids)
uids.sort()
uids1.sort()
for (i = 0; i < uids.length; i++){
console.log("here")
console.log(`uids is ${uids[i]} and uids1 is ${uids1[i]}`)
if (uids[i] == uids1[i]){
return admin.firestore().runTransaction(function(transaction) {
sfDocRef = admin.firestore().doc('users/'+uids[i])
// This code may get re-run multiple times if there are conflicts.
transaction.get(sfDocRef).then(function(sfDoc) {
if (!sfDoc.exists) {
throw "Document does not exist!";
}
var newCrowns = sfDoc.data().crowns + 1;
return transaction.update(sfDocRef, { crowns: newCrowns });
});
}).then(function() {
console.log("Transaction successfully committed!");
}).catch(function(error) {
console.log("Transaction failed: ", error);
});
}
}
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
});
admin.firestore().doc('winners/uids').update({
uids: uids
});
} else {
console.log("No such document!");
}
});
console.log("This job is run every 5 minutes!");
});