我正在尝试对来自另一个链代码(cc02
)的链代码(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函数中。我在这做错了什么?
答案 0 :(得分:1)
它返回一个缓冲区,因此您需要执行以下操作:
替换以下行:
return shim.success(valString);
使用:
return shim.success(Buffer.from(valString));
第一个链码(cc01)获取对象响应而不是字符串。
答案 1 :(得分:0)
我在调用chaincode时遇到了类似的问题,它仅从一个通道访问网络中另一个chaincode的查询。似乎调用了 invokeChaincode :
var response = stub.invokeChaincode("MyChaincode", ["query", key])
不仅返回查询的有效负载,还通过附加事务ID和通道以及读/写集来修改查询。 (这是v1.2软件包和网络的。)
response.payload.toString()正在为我返回:
�{"carId":"CAR_0001"}"@48147a5a84e591671363053e58e4c56fe5d3e42c4adce1ecb2ce92f9922fd5b6:mychannel
查询的交易ID为:48147a5a84e591671363053e58e4c56fe5d3e42c4adce1ecb2ce92f9922fd5b6
和我的频道名称:mychannel。不确定是什么意思。
即使有效负载传递给shim.success(payload),我也确认是:
{"carId":"CAR_0001"}
这令人难以置信,因为我不知道为什么它会修改实际的有效负载字符串。我的解决方法是从响应中提取带有indexOf和lastIndexOf括号的json字符串。
根据docs:
如果被调用的链码在同一频道上,则只需添加 称为链码读取集和写入集到调用事务。
但是文档中没有提到修改有效负载或有关事务ID或通道名称的任何事情。
希望这有助于从同一通道上的其他链码中查询链码。如果我说错了话,请纠正我。