Hyperledger fabric Hyperledger结构-在NodeSDK中调用返回[Object]的代码

Hyperledger fabric Hyperledger结构-在NodeSDK中调用返回[Object]的代码,hyperledger-fabric,hyperledger,ibm-blockchain,Hyperledger Fabric,Hyperledger,Ibm Blockchain,我正试图从另一个链码(cc01)对链码(cc02)执行查询,这两个链码都位于同一频道上。当我试图通过调用stub.invokeChaincode(…)来调用查询函数时,该命令返回的是一个[Object Object],而不是查询结果。有人能告诉我这是什么错误吗 更多详细信息 cc01中查询函数的最低版本如下: async queryOtherContract(stub, args) { let chaincodeName = args[0]; //cc02 let fcn = a

我正试图从另一个链码(
cc01
)对链码(
cc02
)执行查询,这两个链码都位于同一频道上。当我试图通过调用stub.invokeChaincode(…)来调用查询函数时,该命令返回的是一个
[Object Object]
,而不是查询结果。有人能告诉我这是什么错误吗

更多详细信息

cc01
中查询函数的最低版本如下:

async queryOtherContract(stub, args) {
    let chaincodeName = args[0]; //cc02
    let fcn = args[1];           //query
    let fcnArgs = args[2];       //key
    let channel = args[3];       //defaultchannel
    let queryResponse = await stub.invokeChaincode(chaincodeName, [fcn, fcnArgs], channel);
    console.log('Query response: ', JSON.stringify(queryResponse));
}
输出:

Query response: {"status":200,"message":"","payload":{"buffer":{"type":"Buffer","data":[8,6...108]},"offset":9,"markedOffset":-1,"limit":59,"littleEndian":true,"noAssert":false}}
有效负载缓冲区解码为
[Object Object]

cc02
查询的函数如下:

async query(stub, args) {
    let key = args[0]; //key
    let valueAsBytes = await stub.getState(key);
    let valString = valueAsBytes.toString('utf8');
    console.log('Value String: ', valString);
    return shim.success(Buffer.from(valString));
}
输出:
值字符串:Value001


我还尝试了不同的变体,包括直接发送
valueAsBytes
,以及直接返回
valString
,而不是将其包装在shim函数中。我做错了什么?

它正在返回一个缓冲区,因此您需要执行以下操作:

替换以下行:

return shim.success(valString);
与:


第一个链码(cc01)获取对象响应,而不是字符串

在只有一个通道的网络中,从另一个链码调用chaincode invoke查询时,我遇到了类似的问题。似乎对调用invokeChaincode的调用:

var response = stub.invokeChaincode("MyChaincode", ["query", key])
不仅返回查询的有效负载,还通过将事务id和通道与读/写集一起追加来修改查询。(这适用于v1.2软件包和网络。)

response.payload.toString()正在为我返回:

�{"carId":"CAR_0001"}"@48147a5a84e591671363053e58e4c56fe5d3e42c4adce1ecb2ce92f9922fd5b6:mychannel
其中,查询的事务id为:48147a5a84e591671363053e58e4c56fe5d3e42c4adce1ecb2ce92f9922fd5b6

我的频道名称:mychannel。不太清楚是什么� 代表

即使有效载荷传递给shim.success(有效载荷),我确认为:

{"carId":"CAR_0001"}
这令人难以置信地困惑,因为我不知道为什么它会修改实际的有效负载字符串。我的解决方法是从响应中提取带有indexOf和lastIndexOf括号的json字符串

根据报告:

如果被调用的链码位于同一通道上,它只需添加 调用链码读取集和写入集到调用事务

但是文档没有提到修改有效负载或任何关于事务id或通道名称的内容


希望这有助于从同一频道上的其他链码中查询链码。如果我说错了什么,请纠正我。

我的错。我实际上是在返回Buffer.from(valString),相应地编辑了问题。我反序列化只是为了将其打印到控制台,并尝试发送valAsBytes。发送valAsBytes也会给出[Object Object]您可以尝试以下操作吗:console.log('Query response:',Buffer.from(JSON.parse(queryResponse.payload.Buffer.data)).toString('utf8');我已经设法解决了这个问题。事实证明,错误出现在有效负载解码部分,我希望被调用方链码在实际接收对象时给出一个字符串。这是一个令人尴尬的错误。如果你只是编辑你的答案,提到cc01得到的是对象响应而不是字符串,我会接受它。谢谢!@KBhokray你详细说明了吗?我现在面临着完全相同的问题。(你读取接收到的对象的代码是什么?@Andromelus我已经有一段时间没有参与该项目了,现在我已经转移到另一个平台。我甚至在我的VCS中也找不到该部分。FWIW,这是我得到的最接近的:CC:async getUserAccount(stub,args){let usrAsBytes=await stub.getState(args[0])let usrStr=usrAsBytes.toString('utf8')var usr=JSON.parse(usrStr)return shim.success(Buffer.from(JSON.stringify(usr))}Client:let usr=await channel.queryByChaincode(request)var usrStr=usr[0]。toString('utf8')var usrJson=JSON.parse(usrStr)
{"carId":"CAR_0001"}