Hyperledger fabric 从GetPrivateStateBerRange查询访问结构状态属性

Hyperledger fabric 从GetPrivateStateBerRange查询访问结构状态属性,hyperledger-fabric,hyperledger,hyperledger-fabric-sdk-js,Hyperledger Fabric,Hyperledger,Hyperledger Fabric Sdk Js,我有以下问题。我正在尝试编写一个chaincode函数,它查询我的私有数据存储,并根据一些属性检查返回状态的子集。让我们以fabcar为例,假设汽车状态在我的收藏中是私有的。我想根据属性查询所有满足特定条件的汽车。所以我想我可以像queryAllCars函数一样循环遍历状态,然后在解析后访问字段。下面是我针对不同用例的方法。这总是抛出“无法读取未定义的属性颜色”。我不明白这怎么可能是未定义的。如果没有propertycheck,则会返回一条JSON格式的记录,其中包含相应的属性(颜色、品牌、型号

我有以下问题。我正在尝试编写一个chaincode函数,它查询我的私有数据存储,并根据一些属性检查返回状态的子集。让我们以fabcar为例,假设汽车状态在我的收藏中是私有的。我想根据属性查询所有满足特定条件的汽车。所以我想我可以像queryAllCars函数一样循环遍历状态,然后在解析后访问字段。下面是我针对不同用例的方法。这总是抛出“无法读取未定义的属性颜色”。我不明白这怎么可能是未定义的。如果没有propertycheck,则会返回一条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')