0

사용자가 작업을 수행 할 때 보상을 원합니다. 그의 '동전'에 대한 경로가 아직 존재하지 않을 수도 있습니다. 따라서 오류가 발생하는 이유는 다음과 같습니다.수집/문서가 있는지 여부에 관계없이 트랜잭션 실행 - Firestore - Cloud Functions

Transaction failure: Error: The data for XXX does not exist.

경로가 아직 존재하지 않을 때 어떻게 트랜잭션을 실행할 수 있습니까? 이것은 내가 뭘하려 :

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

답변

0

내가이 문서를 건너 왔어요 : 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) 
}) 
관련 문제