0

は、私は、ユーザーが作成し、ユーザーのリストにそのユーザを保存し、最終的にはユーザーのカウンタをインクリメントされるたびにトリガクラウド機能で関数を記述しようとしています。 しかし私は約束を正しく使用しているかどうかはわかりません。 Firebaseのクラウド機能:トランザクション約束の使い方

exports.saveUser = functions.auth.user().onCreate(event => { 
 
    
 
    const userId = event.data.uid 
 
    
 
    const saveUserToListPromise = db.collection("users").doc(userId).set({ 
 
     "userId" : userId 
 
    }) 
 
    
 
    var userCounterRef = db.collection("users").doc("userCounter"); 
 
    
 
    const transactionPromise = db.runTransaction(t => { 
 
     return t.get(userCounterRef) 
 
      .then(doc => { 
 
       // Add one user to the userCounter 
 
       var newUserCounter = doc.data().userCounter + 1; 
 
       t.update(userCounterRef, { userCounter: newUserCounter }); 
 
      }); 
 
    }) 
 
    .then(result => { 
 
     console.log('Transaction success!'); 
 
    }) 
 
    .catch(err => { 
 
     console.log('Transaction failure:', err); 
 
    }); 
 
    
 
    return Promise.all([saveUserToListPromise, transactionPromise]) 
 

 
})
は私が多くのユーザーは、私のuserCounterがまだ正しいことを一度に登録した場合でもことを確認するとsaveUser機能は、取引前に終了してに保存されないことリストが発生しました。

だから私は、このアウトを試してみましたが、これは私が欲しい機能を達成するための正しい方法であり、多くのユーザーが実際に存在する場合に、これはまだ動作するか私もわからない場合しかし、私は知らないだけで正常に動作します一度にその機能をトリガする。

あなたが私を助けてくれることを願っています。 ありがとうございます。

答えて

0

transactionで複数の書き込みをアトミックに実行する正しい方法は、トランザクションブロック内のTransactionオブジェクト(ここではt)ですべての書き込みを実行することです。これにより、すべての書き込みが成功するかどうかが保証されます。

exports.saveUser = functions.auth.user().onCreate(event => { 
    const userId = event.data.uid 
    return db.runTransaction(t => { 
     const userCounterRef = db.collection("users").doc("userCounter") 
     return t.get(userCounterRef).then(doc => { 
      // Add one user to the userCounter 
      var newUserCounter = doc.data().userCounter + 1 
      t.update(userCounterRef, { userCounter: newUserCounter }) 
      // And update the user's own doc 
      const userDoc = db.collection("users").doc(userId) 
      t.set(userDoc, { "userId" : userId }) 
     }) 
    }) 
    .then(result => { 
     console.info('Transaction success!') 
    }) 
    .catch(err => { 
     console.error('Transaction failure:', err) 
    }) 
}) 
+0

ああ大丈夫素敵なありがとうございます。物事をより洗練された「安全な」方法と考えています。 – Max