我正在尝试在我的angular6 / typescript应用程序中编写一个Firebase事务。外观如下:
console.log('point 1');
const transaction = db.runTransaction(t => {
console.log('point 2');
const docRef = db.collection('Pending').doc(req.query.inviteId);
console.log('point 3');
const p = t.set(docRef, acceptance).commit();
console.log('p = ', p);
return p;
}).then(result => {
console.log('result = ', result);
}).catch(err => {
console.log('err = ', err);
});
输出内容如下:
信息:点1
信息:点2
信息:第3点
信息:p =承诺{}
信息:点2
信息:第3点
信息:p =承诺{}
信息:点2
信息:第3点
信息:p =承诺{}
信息:点2
信息:第3点
信息:p =承诺{}
信息:点2
信息:第3点
信息:p =承诺{}
info:err = {错误:10已中止:引用的事务已过期或不再有效。 在Object.exports.createStatusError(/Users/gibranshah/repos/eva-firebasefunctions/functions/node_modules/grpc/src/common.js:87:15) 在Object.onReceiveStatus(/Users/gibranshah/repos/eva-firebasefunctions/functions/node_modules/grpc/src/client_interceptors.js:1188:28) 在InterceptingListener._callNext(/Users/gibranshah/repos/eva-firebasefunctions/functions/node_modules/grpc/src/client_interceptors.js:564:42) 在InterceptingListener.onReceiveStatus上(/Users/gibranshah/repos/eva-firebasefunctions/functions/node_modules/grpc/src/client_interceptors.js:614:8) 在回调时(/Users/gibranshah/repos/eva-firebasefunctions/functions/node_modules/grpc/src/client_interceptors.js:841:24) 代码:10, 元数据:元数据{_internal_repr:{}}, 详细信息:“引用的交易已过期或不再有效。” }
换句话说,它似乎可以很好地运行事务(并且我已经验证了我要提交给数据库的数据实际上已经提交给数据库了),但是它想通过直到它到期,这时catch块会打印出错误:
错误:10已中止:引用的事务已过期或不再有效。
为什么我的交易要重复进行直到到期?我还需要对p做些什么(t.set(…).commit()返回的诺言)?是否可以向调用函数(db.runTransaction(…))表示我们已完成交易?
谢谢。