无法从getStateByPartialCompositeKey获得响应

问题描述 投票:0回答:1

我无法从getStateByPartialCompositeKey方法获得响应。我可以很好地使用putStategetState,但不能使用getStateByPartialCompositeKey。我正在使用Fabric链代码的NodeJS fabric-contract-api版本。

为了进行开发,我使用了this commercial-paper example。此示例使用测试网络环境,该环境工作正常。

This implementation提供了一些账本API实用程序类,我也正在使用这些类与账本进行交互。它有两个类,state.jsstateList.js我添加了一个最有状态的方法getAllStatesFromPartialCompositeKey尝试使用getStateByPartialCompositeKey方法。

Package.json

{
  "name": "informed-consent-form-contract",
  "version": "0.0.5",
  "description": "Papernet Contract",
  "main": "index.js",
  "engines": {
    "node": ">=8",
    "npm": ">=5"
  },
  "scripts": {
    "lint": "eslint .",
    "pretest": "npm run lint",
    "test": "nyc mocha test --recursive",
    "start": "fabric-chaincode-node start",
    "mocha": "mocha test --recursive"
  },
  "engineStrict": true,
  "author": "hyperledger",
  "license": "Apache-2.0",
  "dependencies": {
    "axios": "^0.19.2",
    "fabric-contract-api": "^2.0.0",
    "fabric-shim": "^2.0.0",
    "node-fetch": "^2.6.0",
    "nodemon": "^2.0.2"
  },
  "devDependencies": {
    "chai": "^4.1.2",
    "chai-as-promised": "^7.1.1",
    "eslint": "^4.19.1",
    "mocha": "^5.2.0",
    "nyc": "^12.0.2",
    "sinon": "^6.0.0",
    "sinon-chai": "^3.2.0"
  },
  "nyc": {
    "exclude": [
      "coverage/**",
      "test/**"
    ],
    "reporter": [
      "text-summary",
      "html"
    ],
    "all": true,
    "check-coverage": true,
    "statements": 100,
    "branches": 100,
    "functions": 100,
    "lines": 100
  }
}

Contract.js代码段:

/**
 * 
 * @param {*} ctx 
 * @param {*} partialKey - Piece of key to serch
 */
async getAllStates(ctx, partialKey) {
  let result = await ctx.informedConsentFormStateList.getStatesFromPartialCompositeKey(partialKey);
  console.log('================ Result inside getAllStates method ================');
  console.log(result);
  return result;
} // fin func

Insinde notifyedConsentFormStateList.js:

```
async getStatesFromPartialCompositeKey(partialKey) {
        return this.getAllStatesFromPartialCompositeKey(partialKey);
    }
```

在修改后的stateList.js内:

/**
* @function getAllStatesFromPartialCompositeKey
*/
async getAllStatesFromPartialCompositeKey(partialArgument) {
  console.log('================ Called from beginning of getAllStatesFromPartialCompositeKey ================');
  console.log('================ name => ' + this.name);
  let key = this.ctx.stub.createCompositeKey(this.name, [partialArgument]);
  console.log('================ created partial key .....');
  console.log(partialArgument);
  console.log(key);
  let response = await this.ctx.stub.getStateByPartialCompositeKey(this.name, [key]); //.toString('utf8')
  console.log('================ response below ================');
  console.log(response);
  let results = await this.getAllResults(response);
  return results;
} // fin getAllStatesFromPartialCompositeKey

这是我如何调用它:

/home/ubilab/fabric2/fabric-samples/test-network$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name informed_consent_9 --tls true --cafile $ORDERER_CA --peerAddresses localhost:7051 --tlsRootCertFiles $ORG1_CA -c '{"Args":["csacmpcc:getAllStates","P03"]}'

响应:

chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 payload:"[]"

Chaincode容器日志:

================ Called from beginning of getAllStatesFromPartialCompositeKey ================
================ name => org.csa.informedconsentformstatelist
================ created partial key .....
P03
org.csa.informedconsentformstatelistP03
================ Result inside getAllStates method ================
[]

Couchdb存储状态:

{
  "id": "\u0000org.csa.informedconsentformstatelist\u0000\"P03\"\u0000\"R68\"\u0000",
  "key": "\u0000org.csa.informedconsentformstatelist\u0000\"P03\"\u0000\"R68\"\u0000",
  "value": {
    "rev": "1-74db76a10ad8251ce2ba49ad58710ad8"
  },
  "doc": {
    "_id": "\u0000org.csa.informedconsentformstatelist\u0000\"P03\"\u0000\"R68\"\u0000",
    "_rev": "1-74db76a10ad8251ce2ba49ad58710ad8",
    "class": "org.csa.informedconsentform",
    "consentStatus": "1",
    "currentState": null,
    "key": "\"P03\":\"R68\"",
    "patientID": "P03",
    "reserachID": "R68",
    "sensors": "{numberOfSensors:1,sensors:[{sensorID:s01,name:SPO2,startDate:5/12/2020,endDate:5/12/2021}]}",
    "~version": "CgMBZQA="
  }
}

[如果您需要更多信息以帮助我,请随时提出:)。谢谢!

javascript couchdb hyperledger-fabric hyperledger-chaincode hyperledger-fabric-sdk-js
1个回答
0
投票

鉴于您要使用单个属性进行查询,请尝试直接使用partialKey变量,而不要构建复合键。

let response = await this.ctx.stub.getStateByPartialCompositeKey(this.name, [partialKey]);

API docs

© www.soinside.com 2019 - 2024. All rights reserved.