Javascript Firebase事务多次更新

Javascript Firebase事务多次更新,javascript,firebase,firebase-realtime-database,transactions,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Transactions,Google Cloud Functions,我正在尝试在我的应用程序中创建一个用户评级系统,其中一个用户可以对另一个用户进行1-5星级评级,并描述他们的体验。我的平均评级系统有问题,因为我的事务一次只能更新每个文档中的一个表。也许我走错了方向,需要一些建议或帮助 count字段得到可靠的更新,它将像在我的测试中一样递增。要正确计算平均评级是行不通的。我想是因为我试图在一个函数中完成两个事务 db: firebase功能: exports.calculateReputation = functions.database.ref('/repu

我正在尝试在我的应用程序中创建一个用户评级系统,其中一个用户可以对另一个用户进行1-5星级评级,并描述他们的体验。我的平均评级系统有问题,因为我的事务一次只能更新每个文档中的一个表。也许我走错了方向,需要一些建议或帮助

count字段得到可靠的更新,它将像在我的测试中一样递增。要正确计算平均评级是行不通的。我想是因为我试图在一个函数中完成两个事务

db:

firebase功能:

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;
        });
    });
});

可能更大的问题是,您没有从函数返回一个承诺,该函数在该函数中完成所有异步工作时会解析。@DougStevenson您的意思是将数据返回到.transaction.then()?任何时候处理返回承诺的事情,如transaction(),最终返回的承诺需要考虑到这一点。
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;
        });
    });
});