【问题标题】:Accessing fabric state attributes from getPrivateStateByRange query从 getPrivateStateByRange 查询访问结构状态属性
【发布时间】:2020-01-17 15:42:10
【问题描述】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 2021-11-05
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      相关资源
      最近更新 更多