Node.js 在事务中更新google cloud firestore中的2个字段
我有一个由一个更新操作和一个集合操作组成的事务。从客户端,我向事务发送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.
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) 显示(错误的)结果,例如将侦听器附加到节点并记录值?