我遇到以下问题。我正在尝试编写一个链码函数来查询我的私有数据存储并根据某些属性检查返回状态的子集。让我们以 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 ===========');
}