javascript - Firebase 的云功能 : how to use a Transaction promise?

标签 javascript node.js firebase google-cloud-functions google-cloud-firestore

我正在尝试在 Cloud Functions 中编写一个函数,该函数在每次创建用户时触发,然后将该用户保存到用户列表中,最后递增一个用户计数器。 但是我不确定我是否正确使用了 promise 。

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 函数不会在事务发生之前终止并且保存到列表中。

所以我尝试了这个并且它工作得很好但是我不知道这是否是实现我想要的功能的正确方法而且我也不知道当实际上有很多用户触发时这是否仍然有效立即执行该功能。

希望你能帮助我。 提前致谢。

最佳答案

transaction 中以原子方式执行多次写入的正确方法是用 Transaction 执行所有写入事务 block 内的对象(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
            t.update(userCounterRef, { userCounter: FirebaseFirestore.FieldValue.increment(1) })
            // 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)
    })
})

关于javascript - Firebase 的云功能 : how to use a Transaction promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47749808/

相关文章:

javascript - 用于删除仅包含空子项的空 html 标记的正则表达式

javascript - 无论用户的时区如何,如何始终将日期设置为东部时间

javascript - Angular js RouteProvider 中的问题

node.js - GRPC Golang 服务器和 NodeJS 客户端。 TLS 连接失败

仪表板上的 Firebase Analytics 自定义事件参数

javascript - 从 firebase 登出后从 google 登出

javascript - Google Maps API '.pac-item:first' 返回格式错误

javascript - 尝试对基于回调的函数进行 thunkify 以与生成器(yield)一起使用,不起作用

android - 尝试将 firebase 库添加到使用谷歌地图 API 的应用程序时出错

javascript - 我的代码不起作用。如何删除 Firebase 列表中的元素?