我试图从另一个链码(cc01)中对链码(cc01)执行查询,这两个链码都驻留在同一个通道上。当我尝试通过调用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));
}输出:Value String: Value001
我也尝试过不同的变体,包括直接发送valueAsBytes,以及直接返回valString,而不是将其包装在shim函数中。我在做什么错事?
发布于 2018-04-17 12:56:46
它正在返回一个缓冲区,因此您需要执行以下操作:
替换以下一行:
return shim.success(valString);通过以下方式:
return shim.success(Buffer.from(valString));第一个链码(cc01)获得对象响应,而不是字符串。
发布于 2019-07-23 17:53:42
我在一个只有一个通道的网络中从另一个链码调用链码调用查询时遇到了类似的问题。似乎对invokeChaincode的调用
var response = stub.invokeChaincode("MyChaincode", ["query", key])不仅返回查询的有效负载,还通过附加事务id和通道以及读/写集来修改查询。(这与v1.2包和网络有关。)
response.payload.toString()正在为我返回:
�{"carId":"CAR_0001"}"@48147a5a84e591671363053e58e4c56fe5d3e42c4adce1ecb2ce92f9922fd5b6:mychannel查询的事务id为: 48147a5a84e591671363053e58e4c56fe5d3e42c4adce1ecb2ce92f9922fd5b6
我的频道名:我的频道。不太确定�代表的是什么。
即使有效负载传递给shim.success(有效载荷),我还是确认如下:
{"carId":"CAR_0001"}这是令人难以置信的混乱,因为我不知道为什么它会修改实际的有效负载字符串。我的解决方法是从响应中提取带有indexOf和lastIndexOf括号的json字符串。
根据文档
如果被调用的链码位于同一通道上,它只需将被调用的链码读集和写集添加到调用事务中。
但是,文档没有提到修改有效负载,也没有提到任何有关事务id或通道名称的内容。
希望这有助于从同一通道上的其他链码中查询链码。如果我说错了什么,请纠正我。
https://stackoverflow.com/questions/49878297
复制相似问题