hyperledger-fabric - 从 getPrivateStateByRange 查询访问结构状态属性
问题描述
我遇到以下问题。我正在尝试编写一个链码函数来查询我的私有数据存储并根据某些属性检查返回状态的子集。让我们以 fabcar 为例,假设汽车状态在我的收藏中是私有的。我想根据属性查询所有满足特定条件的汽车。所以我想我可以像在 queryAllCars 函数中一样循环遍历状态,然后在解析后访问这些字段。以下是我针对不同用例的方法。这总是抛出“无法读取未定义的属性颜色”。我不明白这怎么可能是未定义的。如果没有属性检查,则会返回 JSON 格式的具有相应属性(颜色、品牌、型号...)的记录。
async queryAllPrivateCarsWithSomeConditions(ctx) {
const startKey = 'CAR0';
const endKey = 'CAR999';
const range = await ctx.stub.getPrivateDataByRange(startKey, endKey);
const allResults = [];
while (true) {
const res = await range.iterator.next();
if (res.value && res.value.value.toString()) {
console.log(res.value.value.toString('utf8'));
const Key = res.value.key;
let car;
let color;
try {
car = JSON.parse(res.value.value.toString('utf8'));
color = CarRecord.color;
if(Color == "x"){
//whatever
}
} catch (err) {
console.log(err);
Record = res.value.value.toString('utf8');
}
allResults.push({ Key, Record });
}
if (res.done) {
console.log('end of data');
await range.iterator.close();
console.info(allResults);
return JSON.stringify(allResults);
}
}
}
在单个状态查询的情况下,似乎可以访问属性,如示例 changeCarOwner 中我可以在解析后访问对象道具颜色。
code
async changeCarOwner(ctx, carNumber, newOwner) {
console.info('============= START : changeCarOwner ===========');
const carAsBytes = await ctx.stub.getState(carNumber); // get the car from chaincode state
if (!carAsBytes || carAsBytes.length === 0) {
throw new Error(`${carNumber} does not exist`);
}
const car = JSON.parse(carAsBytes.toString());
car.owner = newOwner;
await ctx.stub.putState(carNumber, Buffer.from(JSON.stringify(car)));
console.info('============= END : changeCarOwner ===========');
}
解决方案
您的代码中似乎CarRecord
确实未定义。尝试更改color = CarRecord.color;
为color = car.color;
. 请注意car
,notCarRecord
已在前一行初始化:car = JSON.parse(res.value.value.toString('utf8'));
.
推荐阅读
- scala - Scala - 生成所有组合(按顺序)并计数
- java - 使用 Spring MVC 从数据库存储和检索图像时图像损坏
- javascript - 如何阻止 Internet Explorer 缓存 API 调用?
- amazon-web-services - 如何从我的 AWS linux EC2 实例调用浏览器
- iframe - 在 iframe 中显示 YouTube 页面
- java - 如何将月份字符串(例如“January”、“February”)转换为整数值?
- python - 使用 Numpy.rate 计算年化利率
- python - freeze_inference_graph.pb 和 saved_model.pb 有什么区别?
- java - 如何使用文本观察器更新表单中多个字段的进度条?
- scala - [B 无法在 Spark scala 流中转换为 [Ljava.lang.Byte