Node.js 在事务中更新google cloud firestore中的2个字段

Node.js 在事务中更新google cloud firestore中的2个字段,node.js,google-cloud-firestore,Node.js,Google Cloud Firestore,我有一个由一个更新操作和一个集合操作组成的事务。从客户端,我向事务发送2个并发请求。更新操作发生多次,即使设置未成功 public addChatMessage(msg, callback, errorCallBack) { let msgColl = this.admin.firestore().collection('messages'); var obj1 = JSON.parse(msg); var uid1 = obj1.message.

我有一个由一个更新操作和一个集合操作组成的事务。从客户端,我向事务发送2个并发请求。更新操作发生多次,即使设置未成功

public addChatMessage(msg, callback, errorCallBack) {
        let msgColl = this.admin.firestore().collection('messages');
        var obj1 = JSON.parse(msg);
        var uid1 = obj1.message.senderID + "_"+obj1.message.senderLocalPostNo;
        this.admin.firestore().collection('messages').doc(uid1).get().then((docSnapshot) => {
            if (!docSnapshot.exists) {
                let metaRef = this.admin.firestore().doc('messages/msgsMeta');
                let msgRef = msgColl.doc(uid1);
                let transaction = this.admin.firestore().runTransaction(t => {

                    return t.get(msgRef).then(a => {
                        return t.get(metaRef)
                        .then(doc => {
                            let newCounter = doc.data().counter + 1;
                            var finalResult = {message:obj1.message,serverPostNo:newCounter};
                            t.update(metaRef, {counter: newCounter});
                            t.set(msgRef, finalResult);
                        });
                    });

                }).then(result => {
                console.log('Transaction success', result);
                }).catch(err => {
                console.log('Transaction failure:', err);
                });
            } else {
                console.log("document already exists");
            }
        });
            console.log("EOF addChatMessage");
    }

如果set操作无法执行,我希望update操作回滚,但它不会回滚。

这听起来确实很奇怪。由于在同一事务上调用了
t.update
t.set
,因此它们要么都执行,要么都不运行。但是
this.admin.firestore().collection('messages').doc(uid1.get()
中的嵌套使得我很难理解它。您能否:1)仅通过一个事务而不通过其他数据库交互重现问题?2) 显示(错误的)结果,例如将侦听器附加到节点并记录值?这听起来确实很奇怪。由于在同一事务上调用了
t.update
t.set
,因此它们要么都执行,要么都不运行。但是
this.admin.firestore().collection('messages').doc(uid1.get()
中的嵌套使得我很难理解它。您能否:1)仅通过一个事务而不通过其他数据库交互重现问题?2) 显示(错误的)结果,例如将侦听器附加到节点并记录值?