我遇到以下问题。我正在尝试编写一个chaincode函数,该函数查询我的私有数据存储并根据一些属性检查返回状态的子集。让我们以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
而不是CarRecord
提前初始化了一行:car = JSON.parse(res.value.value.toString('utf8'));
。