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"}