避免在Firestore中同时发出两个请求

时间:2019-01-07 00:40:53

标签: javascript database firebase transactions google-cloud-firestore

我创建了一个与Firestore数据库通信的函数。 首先,检查关系中是否包含某些内容。如果没有,则添加一些内容。 如果已经存在,则使用数据,然后删除查询的关系中的条目。但是您必须在函数中添加它(其他部分)。现在的问题是,当两个用户同时执行功能时会发生什么。 当第一个用户完成请求时,是否可以将第二个用户放入队列?

  let ref = db.collection('relation1')。doc('test')。collection('user');
      var checkForAdd = ref.get()。then(快照=> {
        if(snapshot.size <1){
            db.collection('relation1')。doc('test')。collection('user')。add({
                用户:“测试”,
                createdAt:Date.now()
            })。catch(err => {
                console.log(err)
            })
        }
 

1 个答案:

答案 0 :(得分:3)

  

Cloud Firestore支持用于读取和写入数据的原子操作。在一组原子操作中,要么所有操作都成功,要么不应用任何操作。

https://firebase.google.com/docs/firestore/manage-data/transactions

// Create a reference to the user doc you want to create if it doesn't exist.
const userCollectionRef = db.collection('relation1').doc('test').collection('user');
const userDocRef = userCollectionRef.doc('documentID');

return db.runTransaction(transaction => {
    // This code may get re-run multiple times if there are conflicts.
    return transaction.get(userDocRef).then(userDoc => {
        if (userDoc.exists) {
            // If something already exists then use the data and
            // then delete the entry in the queried relation.
        } else {
            transaction.update(userDocRef, {
                user: 'Test',
                createdAt: Date.now()
            });
        }
    });
}).then(() => {
    console.log("Transaction successfully committed!");
}).catch(error => {
    console.log("Transaction failed: ", error);
});