[英]Illegal Buffer with mango query in Hyperledger fabric?
問題:
我創建了一個 Hyperledger 結構網絡,其中每個組織由 6 個組織和 2 個對等點組成。 我已經在其中的 6 個對等節點上安裝了一個鏈碼,並且我已經在那些我安裝了鏈碼的對等節點上配置了 6 個 couch Db 實例。 我成功地完成了我的鏈碼的所有其他交易,除了我運行芒果查詢的交易。 這是我運行芒果查詢的函數。
async nthUsersLands(stub, args) {
let nic = args[0];
const query = JSON.stringify({
selector: {
docType: "land",
owner: nic
}
});
console.log(typeof query);
console.log(JSON.stringify(query));
let landsAsBytes = await stub.getQueryResult(query);
console.log(landsAsBytes.toString());
return landsAsBytes;
}
這就是我通過 cli 調用此函數的方式。
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C myc -n mycc -c '{"Args":["nthUsersLands","942990014V"]}'
這讓我在鏈碼對等體上出現了這個錯誤。
> 2019-06-10T02:56:56.937Z error [_]
> error: Unhandled Rejection reason TypeError: Illegal buffer promise
> Promise { <rejected> TypeError: Illegal buffer
> at Function.module.exports.ByteBuffer.wrap (/usr/local/src/node_modules/bytebuffer/dist/bytebuffer-node.js:378:23)
> at Element.ProtoBuf.Reflect.ElementPrototype.verifyValue (/usr/local/src/node_modules/protobufjs/dist/protobuf.js:1886:39)
> at Field.ProtoBuf.Reflect.FieldPrototype.verifyValue (/usr/local/src/node_modules/protobufjs/dist/protobuf.js:3499:33)
> at Message.ProtoBuf.Reflect.MessagePrototype.encode (/usr/local/src/node_modules/protobufjs/dist/protobuf.js:3139:57)
> at MessagePrototype.encode (/usr/local/src/node_modules/protobufjs/dist/protobuf.js:2675:27)
> at MessagePrototype.encodeNB (/usr/local/src/node_modules/protobufjs/dist/protobuf.js:2770:37)
> at handleMessage (/usr/local/src/node_modules/fabric-shim/lib/handler.js:658:35)
> at <anonymous>
> at process._tickCallback (internal/process/next_tick.js:188:7) } {"timestamp":"2019-06-10T02:56:56.937Z"}
我嘗試了很多來找到解決此問題的方法,但我無法這樣做。 有人可以幫我解決這個問題嗎? 謝謝你。
請參考面料示例中的彈珠鏈代碼以清楚了解使用芒果選擇器字符串我已粘貼以下代碼集供您參考,請確保您的鏈代碼是否具有此方法..
async queryMarblesByOwner(stub, args, thisClass) {
// 0
// 'bob'
if (args.length < 1) {
throw new Error('Incorrect number of arguments. Expecting owner name.')
}
let owner = args[0].toLowerCase();
let queryString = {};
queryString.selector = {};
queryString.selector.docType = 'marble';
queryString.selector.owner = owner;
let method = thisClass['getQueryResultForQueryString'];
let queryResults = await method(stub, JSON.stringify(queryString), thisClass);
return queryResults; //shim.success(queryResults);
}
//query result method
async getQueryResultForQueryString(stub, queryString, thisClass) {
console.info('- getQueryResultForQueryString queryString:\n' + queryString)
let resultsIterator = await stub.getQueryResult(queryString);
let method = thisClass['getAllResults'];
let results = await method(resultsIterator, false);
return Buffer.from(JSON.stringify(results));
並檢查您的 nic 變量,因為它指向 args[0],這是您的方法名稱
let landsAsBytes = await stub.getQueryResult(query);
它返回一個StateQueryIterator
對象,因此您不能將其直接轉換為字符串。
這里是 getQueryResult 的官方 Shim 文檔:
為了優化查詢性能,建議創建 couchDB 索引:
fabric-samples 存儲庫包含有用的鏈代碼示例:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.