【问题标题】:Run transaction regardless if collection/document exists - Firestore - Cloud Functions无论集合/文档是否存在都运行事务 - Firestore - Cloud Functions
【发布时间】:2017-11-07 23:06:28
【问题描述】:

我想在用户执行某项操作时对其进行奖励。可能会发生他的“硬币”之路还不存在。这就是我收到错误的原因:

事务失败:错误:XXX 的数据不存在。

当路径尚不存在时,如何运行事务?这是我尝试过的:

exports.facebookShared = functions.firestore.document('facebookShared/{randomUID}').onCreate(event => {
    const data = event.data.data()
    const uid = data.uid
    var promises = []
    promises.push(
        db.collection('facebookShared').doc(event.data.id).delete()
    )
    const pathToCoins = db.collection('users').doc(uid).collection('server').doc('server')
    promises.push(
       db.runTransaction(t => {
            return t.get(pathToCoins)
                .then(doc => {
                    var newCoins = 0
                    if (doc.data().hasOwnProperty("coins")){
                        newCoins = doc.data().coins + awardFacebookShare.coins
                    }
                        t.update(pathToCoins, { coins: newCoins });
                });
        })
        .then(result => {
            console.log('Transaction success', result);
        })
        .catch(err => {
            console.log('Transaction failure:', err);
        })
    )
    return Promise.all(promises)
})

【问题讨论】:

    标签: javascript node.js transactions google-cloud-functions google-cloud-firestore


    【解决方案1】:

    我遇到了这个文档:https://cloud.google.com/nodejs/docs/reference/firestore/0.8.x/Firestore#runTransaction

    文档比这里更好:https://firebase.google.com/docs/firestore/manage-data/transactions

    以下代码有效:

    exports.facebookShared = functions.firestore.document('facebookShared/{randomUID}').onCreate(event => {
        const data = event.data.data()
        const uid = data.uid
        var promises = []
        promises.push(
            db.collection('facebookShared').doc(event.data.id).delete()
        )
        const pathToCoins = db.collection('users').doc(uid).collection('server').doc('server')
        promises.push(
           db.runTransaction(t => {
                return t.get(pathToCoins)
                    .then(doc => {
                        var newCoins = awardFacebookShare.coins
                        if (doc.exists){
                        if (doc.data().hasOwnProperty("coins")){
                            newCoins += doc.data().coins
                        }
                            t.update(pathToCoins, { coins: newCoins });
                            return Promise.resolve(newCoins);
                    }else{
                        t.create(pathToCoins, { coins: newCoins });
                        return Promise.resolve(newCoins);
                    }
                    });
            })
            .then(result => {
                console.log('Transaction success', result);
            })
            .catch(err => {
                console.log('Transaction failure:', err);
            })
        )
        return Promise.all(promises)
    })
    

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 2021-05-06
      • 2019-04-19
      • 1970-01-01
      • 2022-10-19
      • 2018-12-10
      • 2019-11-16
      • 1970-01-01
      • 2020-03-21
      相关资源
      最近更新 更多