我正在尝试在 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/