追梦随想
追梦随想
  • 发布:2023-04-21 22:34
  • 更新:2023-04-23 11:51
  • 阅读:201

云对象内执行事务报错:TypeError: transaction.collection is not a function

分类:uniCloud

逻辑描述:
有两个云对象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"} 

请问这是为什么?还是说在事务内不允许这么调用?

2023-04-21 22:34 负责人:无 分享
已邀请:
追梦随想

追梦随想 (作者)

经过测试只要是客户端调用就会报错,哪怕是放在云端也是如此,搞不懂这是bug还是兼容问题

  • DCloud_uniCloud_CRL

    不是bug。无论是在云函数还是客户端中调用云对象都是通过网络调用的,db.startTransaction返回的是一个操作事务的对象,通过网络请求时会对参数序列化后传输,所以在update中就调不到了。

    2023-04-23 11:51

  • 追梦随想 (作者)

    回复 DCloud_uniCloud_CRL: 明白了,感谢解答,希望后期有更好的解决方案,不然就需要写很多遍重复代码。如果我把这部分代码放在公共模块,然后在云对象内调用的话页可以做到重复利用代码,但是这样做否能使用事务呢?

    2023-04-23 16:47

DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

云对象里面调用云对象,是发送的网络请求,你的transaction对象是传不过去的

  • 追梦随想 (作者)

    明白了,感谢解答,希望后期有更好的解决方案,不然就需要写很多遍重复代码。如果我把这部分代码放在公共模块,然后在云对象内调用的话页可以做到重复利用代码,但是这样做否能使用事务呢?

    2023-04-23 16:47

要回复问题请先登录注册