Многократные обновления транзакции Firebase - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь создать систему оценки пользователей в моем приложении, где один пользователь может оценивать другого пользователя с оценкой в ​​1-5 звезд, а также описанием его опыта.У меня проблемы с системой среднего рейтинга, потому что моя транзакция может обновлять только одну таблицу за раз согласно документации.Возможно, я поступаю неправильно и могу воспользоваться некоторыми советами или помощью.

Поле счетчика обновляется надежно, оно будет увеличиваться, как и должно быть в моем тестировании.Получает средний рейтинг, чтобы правильно рассчитать, что не работает.Я думаю, потому что я пытаюсь сделать две транзакции в одной функции.

db:

"reputation" : {
    "userID123" : {
      "-LDXRfZPscamLvjDUbXb" : {
        "ratingUserID2" : {
          "rating" : 3,
          "description" : "You are awesome!"
        }
      },
      "asdfsdfsdf3333" : {
        "ratingUserID3" : {
          "rating" : 4,
          "description" : "Great work."
        }
      }
      "count" : 2,
      "rating" : 3.5
    }
  },
...other data...

firebase function:

exports.calculateReputation = functions.database.ref('/reputation/{userID}/{uniqueID}').onCreate((snap, context) => {
    const data = snap.val();
    const rating = data[Object.keys(data)].rating;

    snap.ref.parent.child('/count').transaction((currentCount) => {
        return currentCount + 1;
    }, (error, committed, snapshot) => {
        if (error) {
            console.log('Transaction failed abnormally!', error);
        } else if (!committed) {
            console.log('We aborted the transaction (because ada already exists).');
        } else {
            console.log('added!');
            console.log('ADD RATING:', rating);
        }
        var count = snapshot.val();
        console.log('COUNT:', count);
        snap.ref.parent.child('/rating').transaction((currentRating) => {
            var newRating = Math.round( ((rating + currentRating) / count) * 10 ) / 10;
            return newRating;
        });
    });
});
...