无法正确获取Hyperledger架构中的状态?

时间:2019-05-09 05:55:31

标签: hyperledger-fabric hyperledger

问题:

我已经开发了Hyperledger架构网络,然后在其中安装了链代码。这是我的Initialize分类帐方法。

async initLedger(stub, args) {
    console.info("============= START : Initialize Ledger ===========");
    let drivers = [];

    drivers.push({
      nic: "123",
      firstName: "Saman",
      lastName: "Frenando",
      status: "Not verified",
      licenceNo: "1234"
    });

    drivers.push({
      nic: "124",
      firstName: "Janith",
      lastName: "Bentharaarachchi",
      status: "Not verified",
      licenceNo: "1235"
    });


    for (let i = 0; i < drivers.length; i++) {
      drivers[i].docType = "driver";
      console.log(drivers[i].nic); 
      await stub.putState(
        drivers[i].nic,
        Buffer.from(JSON.stringify(drivers[i]))
      );
      console.info("Added <--> ", drivers[i]);
    }

 console.info("============= END : Initialize Ledger ===========");
  }

这就是我检索这些数据的方式。

async selectNthDriver(stub, args) {
    if (args.length != 1)  {
      throw new Error(
        "Incorrect number of arguments. Expecting NIC ex: 123"
      );
    }
    let nic = args[0];
    console.log(`nic: ${nic}`);

    let driverAsBytes = await stub.getState(nic); 
    console.log("hi"+driverAsBytes);
    if (!driverAsBytes || driverAsBytes.toString().length <= 0) {
      throw new Error("Driver with NIC" + nic + " does not exist");
    }
    console.log(driverAsBytes.toString());
    return driverAsBytes;
  }

当我在同级上发出此命令时,它会成功初始化分类帐。

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":["initLedger"]}'

当我尝试检索驱动程序时通过发出以下命令,这样会给我一个错误。

  

错误:调用期间认可失败。响应:状态:500消息:“事务返回失败:错误:NIC123驱动程序不存在”

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":["selectNthDriver","123"]}

这是链码日志。

  

2019-05-09T05:18:51.184Z信息[lib / handler.js]
  信息:[myc-09f261c4]调用链码Init()成功。   将完成的消息发送回同位体   {“ timestamp”:“” 2019-05-09T05:18:51.184Z“} {fcn:'initLedger',参数:   []}   =============开始:初始化分类帐=========== 123已添加<-> {nic:'123',firstName:'Saman',lastName:' Fernando',状态:   “未验证”,许可证编号:“ 1234”,docType:“驱动程序”} 124已添加   <-> {nic:'124',firstName:'Janith',lastName:   'Bentharaarachchi',状态:'未验证',许可证编号:'1235',
  docType:“驱动程序”}   =============结束:初始化分类帐=========== {fcn:'selectNthDriver',params:['123']} nic:123 hi   错误:NIC123驱动程序不存在       在selectNthDriver(/usr/local/src/mycc.js:494:13)       在       在process._tickCallback(内部/进程/next_tick.js:188:7)2019-05-09T05:43:42.430Z错误[lib / handler.js]
  错误:[myc-e7aef847]返回调用链码Invoke()   错误响应[错误:NIC123驱动程序不存在]。   将错误消息发送回同位体   {“ timestamp”:“ 2019-05-09T05:43:42.430Z”}

当我通过浏览器进入CouchDB时,它没有显示我初始化的数据。它仅显示此数据。

{
  "_id": "mycc",
  "_rev": "1-5c5ecfec35f65ec74cbe52a52be96048",
  "~version": "\u0000CgMBBwA=",
  "_attachments": {
    "valueBytes": {
      "content_type": "application/octet-stream",
      "revpos": 1,
      "digest": "md5-SkPMcpW++nrvo5v00rCdRQ==",
      "length": 424,
      "stub": true
    }
  }
}

有人可以帮助我找出我在哪里做错了吗?谢谢。

1 个答案:

答案 0 :(得分:0)

您应该使用“ query ”命令使用对等二进制文件从分类账中查询状态,您使用的invoke命令用于生成事务,而查询操作不需要

您应该尝试用查询替换invoke,它看起来应该像这样:

peer chaincode query -o orderer.example.com:7050 -C myc -n mycc -c '{"Args":["selectNthDriver","123"]}

编辑:另外,请在selectNthDriver方法的if语句中检查以下条件:

if (!driverAsBytes.toString()) 

还请在代码中此if语句之前的行中为同一(driverAsBytes.toString())进行控制台。