Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从hyperledger结构GetStateBerRange获取响应时遇到问题_Node.js_Hyperledger Fabric - Fatal编程技术网

Node.js 从hyperledger结构GetStateBerRange获取响应时遇到问题

Node.js 从hyperledger结构GetStateBerRange获取响应时遇到问题,node.js,hyperledger-fabric,Node.js,Hyperledger Fabric,Im使用createCompsiteKey,而getSateByRange仅返回{“完成”:true}。 我试图用concat key part替换createCompsiteKey,使密钥如下所示。 getSateByRange仅返回{“done”:true},我使用的是“fabric shim”v1.4.0和“fabric contract api”v1.4.0。“结构对等”图像为1.4.6 将状态添加到数据库的代码如下: 类状态列表{ 异步addState(状态){ 让keyParts=s

Im使用
createCompsiteKey
,而
getSateByRange
仅返回
{“完成”:true}
。 我试图用concat key part替换
createCompsiteKey
,使密钥如下所示。
getSateByRange
仅返回
{“done”:true}
,我使用的是“fabric shim”v1.4.0和“fabric contract api”v1.4.0。“结构对等”图像为1.4.6

将状态添加到数据库的代码如下:

类状态列表{
异步addState(状态){
让keyParts=state.getSplitKey();
设keyPrefix=(String)(keyParts.slice(0,1));
设keyOthers=keyParts.slice(1);
/*.comment createCompositeKey
让key=this.ctx.stub.createCompositeKey(keyPrefix,keyOthers);
*/
让key=keyParts.map(part=>part.join(“”);
让data=State.serialize(State);
等待这个.ctx.stub.putState(键,数据);
}
}
阶级国家{
构造函数(stateClass、keyParts){
this.class=stateClass;
this.key=State.makeKey(keyParts);
}
静态生成键(关键部件){
返回keyParts.map(part=>part.join(“:”);
}
静态拆分键(键){
返回键。拆分(“:”);
}
}
异步getDevCollectByRange(ctx、startKey、endKey){
设args=[];
args[0]=startKey;
args[1]=结束键;
让xiotdatadevlist=wait ctx.xiotdatadevlist.getDevByRange(args);
返回Buffer.from(xiotdatadevlist);
}
异步getAllResults(迭代器){
让allResults=[];
while(true){
const res=wait iterator.next();
if(res.value&&res.value.value.toString()){
log(res.value.value.toString('utf8');
const Key=res.value.Key;
记录;
试一试{
Record=JSON.parse(res.value.value.toString('utf8');
}捕捉(错误){
控制台日志(err);
记录=res.value.value.toString('utf8');
}
push({Key,Record});
}
如果(已完成){
等待迭代器。关闭();
返回所有结果;
}
}       
}
异步getObjectsByRange(args){
如果(参数长度<2){
抛出新错误('参数数量不正确。应为2');
}
//日期
const startKey=args[0];
const endKey=args[1];
const resultsIterator=wait this.ctx.stub.getStateByRange(startKey,endKey);
让results=wait this.getAllResults(resultsIterator,false);
返回Buffer.from(JSON.stringify(results));
}
如果我使用
createCompsiteKey
,如何
getSateByRange
找到我的记录? 或者结构密钥必须满足什么条件


任何建议,谢谢。

在Fabric的早期版本中,
GetStateBrange
API用于返回复合键,即使在对简单键执行范围查询时也是如此。例如,下面对marble2 chaincode示例的范围查询返回了两个简单键,如
marble2
marble3
,以及复合键,如
color~namebluemarble2
color~namebluemarble2
,其中它应该只返回
marble2
marble3

$peer chaincode query-n mycc1-v0-c{“Args”:[“getMarblesByRange”,“a”,“z”]}-o 127.0.0.1:7050-c ch1

查询结果:

[
    {"Key":"color~namebluemarble3", "Record":}
    {"Key":"color~nameredmarble2", "Record":},
    {"Key":"marble2", "Record":{"docType":"marble","name":"marble2","color":"red","size":50,"owner":"tom"}},
    {"Key":"marble3", "Record":{"docType":"marble","name":"marble3","color":"blue","size":70,"owner":"tom"}}
]
Fabric无法区分简单键和复合键,因此
GetStateByRange()
只能返回简单键

复合键具有objectType前缀。复合键的每一部分都由空字符分隔,例如
chaincodeid 0x00 objectType 0x00 ck1 0x00 ck2 0x00
。这种设计确保了各种复合键类型都有一个objectType命名空间,以保证不同类型之间不会发生冲突。您可以通过将鼠标悬停在任何CouchDB记录上的复制图标上来检查这一点,该记录具有如下图所示的复合键。

现在,
getStateByRange()
只返回简单键,
getstatebyrpartialcompositekey()
只返回复合键。简单键和复合键的名称空间不同,以避免冲突。有关这方面的更多信息,您可以参考本文,其中Fabric维护人员讨论了如何解决此问题

如果在开始和结束时执行无界范围查询,则在结果中不会看到任何组合键。我自己也试过,结果就是这样

对等链码查询-n marbles-C mychannel-C'{“Args”:[“getMarblesByRange”、“”、“”]}

输出:

[
    {"Key":"azurite","Record": 
        {"color":"yellow","docType":"marble","name":"azurite","owner":"john","size":2}
    },
    {"Key":"marble1","Record": 
        {"color":"red","docType":"marble","name":"marble1","owner":"tom","size":50}
    },
    {"Key":"marble2","Record": 
        {"color":"blue","docType":"marble","name":"marble2","owner":"tom","size":70}
    }
]
[
    {"Key":"\u0000color~name\u0000blue\u0000marble2\u0000","Record":"\u0000"}, 
    {"Key":"\u0000color~name\u0000red\u0000marble1\u0000","Record":"\u0000"}, 
    {"Key":"\u0000color~name\u0000yellow\u0000azurite\u0000","Record":"\u0000"}, 
    {"Key":"azurite","Record": 
        {"color":"yellow","docType":"marble","name":"basil","owner":"john","size":2}
    },
    {"Key":"marble1","Record": 
        {"color":"red","docType":"marble","name":"marble1","owner":"tom","size":50}
    },
    {"Key":"marble2","Record": 
        {"color":"blue","docType":"marble","name":"marble2","owner":"tom","size":70}
    }
]
然而,当我保留
\u0000
作为我的开始键时,我也收到了具有复合键的记录

对等链码查询-n marbles4-C mychannel-C'{“Args”:[“getMarblesByRange”、“\u0000”、“]}

输出:

[
    {"Key":"azurite","Record": 
        {"color":"yellow","docType":"marble","name":"azurite","owner":"john","size":2}
    },
    {"Key":"marble1","Record": 
        {"color":"red","docType":"marble","name":"marble1","owner":"tom","size":50}
    },
    {"Key":"marble2","Record": 
        {"color":"blue","docType":"marble","name":"marble2","owner":"tom","size":70}
    }
]
[
    {"Key":"\u0000color~name\u0000blue\u0000marble2\u0000","Record":"\u0000"}, 
    {"Key":"\u0000color~name\u0000red\u0000marble1\u0000","Record":"\u0000"}, 
    {"Key":"\u0000color~name\u0000yellow\u0000azurite\u0000","Record":"\u0000"}, 
    {"Key":"azurite","Record": 
        {"color":"yellow","docType":"marble","name":"basil","owner":"john","size":2}
    },
    {"Key":"marble1","Record": 
        {"color":"red","docType":"marble","name":"marble1","owner":"tom","size":50}
    },
    {"Key":"marble2","Record": 
        {"color":"blue","docType":"marble","name":"marble2","owner":"tom","size":70}
    }
]

因此,总而言之,我认为您不应该使用
getStateByRange
API,而应该使用
getstatebyrpartialcompositekey
来获取具有复合键的记录。

在Fabric的早期版本中,
getStateByRange
API用于返回复合键,即使在对简单键执行范围查询时也是如此。例如,下面对marble2 chaincode示例的范围查询返回了两个简单键,如
marble2
marble3
,以及复合键,如
color~namebluemarble2
color~namebluemarble2
,其中它应该只返回
marble2
marble3

$peer chaincode query-n mycc1-v0-c{“Args”:[“getMarblesByRange”,“a”,“z”]}-o 127.0.0.1:7050-c ch1

查询结果:

[
    {"Key":"color~namebluemarble3", "Record":}
    {"Key":"color~nameredmarble2", "Record":},
    {"Key":"marble2", "Record":{"docType":"marble","name":"marble2","color":"red","size":50,"owner":"tom"}},
    {"Key":"marble3", "Record":{"docType":"marble","name":"marble3","color":"blue","size":70,"owner":"tom"}}
]
Fabric无法区分简单键和复合键,因此
GetStateByRange()
只能返回简单键

复合键具有objectType前缀。复合键的每一部分都由空字符分隔,例如
chaincodeid 0x00 objectType 0x00 ck1 0x00 ck2 0x00
。这是d