Облачная функция Firebase: транзакция восстановления пожара TypeError: Невозможно прочитать свойство 'forEach' из неопределенного - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу обновить и удалить, используя транзакцию в Firebase Cloud Function.

Но получаю ошибку, подобную этой:

enter image description here

Мой код:

 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) => {
                snapshot.forEach(instanceDoc => {
                    var newUserSize = instanceDoc.data().user_size - 1;
                    transaction.update(instanceDoc, { user_size: newUserSize });
                });
            });
        });
    });    

}).then(function() {
    console.log("Transaction successfully committed!");
}).catch(function(error) {
    console.log("Transaction failed: ", error);
});
});

Любая помощь будет высоко оценена.

1 Ответ

0 голосов
/ 23 февраля 2019

Я не пробовал вашу облачную функцию, но проблема, скорее всего, связана с тем, что с

var instanceDocRef = firestore.collection("utils").doc(userDoc.data().instance);
return transaction.get(instanceDocRef).then((snapshot) => {})

вы получаете DocumentSnapshot, а не QuerySnapshot как вы получаете с

var userDocRef = firestore.collection("users").where('uid', '==', user.uid).limit(1);
...
return transaction.get(userDocRef).then((snapshot) => {

A DocumentSnapshot не имеет метода forEach().Вы должны сделать следующее, напрямую вызвав метод data() DocumentSnapshot:

var instanceDocRef = firestore.collection("utils").doc(userDoc.data().instance);
return transaction.get(instanceDocRef).then((snapshot) => {
    var newUserSize = snapshot.data().user_size - 1;
    ...
})
...