从getPrivateStateByRange查询访问结构状态属性

问题描述 投票:0回答:1

我遇到以下问题。我正在尝试编写一个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 ===========');
    }
hyperledger-fabric hyperledger hyperledger-fabric-sdk-js
1个回答
0
投票

似乎CarRecord在您的代码中确实未定义。尝试将color = CarRecord.color;更改为color = car.color;。请注意,car而不是CarRecord提前初始化了一行:car = JSON.parse(res.value.value.toString('utf8'));

© www.soinside.com 2019 - 2024. All rights reserved.