逻辑描述:
有两个云对象A和B,由于某些数据表会被多次调用,或者其他云函数调用,所以放在了另一个单独的云对象内,清晰明了。
在A云对象内使用了事务,同时调用了B云对象,在本地运行A云对象的时候是可以正常操作数据库的,可是用客户端访问A云对象的时候就会报错
TypeError: transaction.collection is not a function
云对象A
module.exports = {
_before: function () { // 通用预处理器
},
async update() {
const db = uniCloud.database();
const transaction = await db.startTransaction();
try {
await transaction.collection('test').doc('635d63e07d78ff0001e7f398').update({
name: '123'
}).catch((err) => {
throw err.errMsg || '操作失败';
});
await uniCloud.importObject('b').update(transaction, '635e6cb67d78ff00010829b8', '456');
await transaction.commit();
return {
errCode: 0,
errMsg: 'ok'
}
} catch (e) {
await transaction.rollback();
throw e;
}
}
}
云对象B
module.exports = {
_before: function () { // 通用预处理器
},
async update(transaction, id, value) {
await transaction.collection('test').doc(id).update({
name: value
}).catch((err) => {
throw err.errMsg || '操作失败';
});
}
}
22:33:09.234 [本地运行][云对象:a],调用方法:[update],执行结果: {"errCode":0,"errMsg":"ok"}
请问这是为什么?还是说在事务内不允许这么调用?
DCloud_uniCloud_CRL
不是bug。无论是在云函数还是客户端中调用云对象都是通过网络调用的,
db.startTransaction
返回的是一个操作事务的对象,通过网络请求时会对参数序列化后传输,所以在update中就调不到了。2023-04-23 11:51
追梦随想 (作者)
回复 DCloud_uniCloud_CRL: 明白了,感谢解答,希望后期有更好的解决方案,不然就需要写很多遍重复代码。如果我把这部分代码放在公共模块,然后在云对象内调用的话页可以做到重复利用代码,但是这样做否能使用事务呢?
2023-04-23 16:47