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

관련 문제