История активов в Hyperledger Fabric

#node.js #hyperledger-fabric #blockchain #smartcontracts #hyperledger-chaincode

#node.js #hyperledger-fabric #блокчейн #смарт-контракты #hyperledger-цепной код

Вопрос:

Я использую node.js чтобы написать цепной код, и я хочу получить историю лекарств в цепочке поставок фармацевтических препаратов. Я развернул цепной код, вызвал контракт на производство и покупку, который изменяет текущее состояние препарата от одного владельца к другому владельцу. Фактически, я только что изменил коммерческий цепной код для этого. Смена владельца отражается в базе данных couchdb. Но когда я пытаюсь получить историю лекарств по ключу лекарства, это работает не так, как ожидалось.

Код, который я использовал

 
const promiseOfIterator = this.ctx.stub.getHistoryForKey(drugKey);
const results = [];
for await (const keyMod of promiseOfIterator) {
            
            const resp = {
                timestamp: keyMod.timestamp,
                txid: keyMod.tx_id
            }
            if (keyMod.is_delete) {
                resp.data = 'KEY DELETED';
            } else {
                resp.data = keyMod.value.toString('utf8');
            }
            results.push(resp);
        }
return results;
  

Когда я распечатал результаты, это дает: []
И когда я делаю это: Drug.fromBuffer(getDrugHistoryResponse); и печатаю его, он выдает Drug { class: 'org.medicochainnet.drug', key: ':', currentState: null }

Как заставить это работать? Что я здесь делаю не так? Пожалуйста, помогите мне.

Комментарии:

1. Не могли бы вы добавить сюда ссылку на полный цепной код, чтобы определить ссылку на ключ.

2. Это то же самое, что и в коммерческом учебном пособии chaincode. Я просто хочу знать историю бумаги в коммерческой бумаге.

Ответ №1:

функция

 ctx.stub.getHistoryForKey(drugKey); 
  

является асинхронной функцией. Итак, вам нужно добавить ожидание

 const promiseOfIterator = await this.ctx.stub.getHistoryForKey(drugKey);
  

Затем вы можете выполнить итерацию по результату.

Комментарии:

1. Затем он выдает эту ошибку: TypeError: promiseOfIterator is not async iterable . А затем я попытался сделать ...for (const keyMod of promiseOfIterator) {... это, просто удалив await, затем он выдал эту ошибку: TypeError: promiseOfIterator is not iterable .

2. Я написал новый ответ, чтобы сделать код более понятным.

Ответ №2:

Я сделал это в подобной демонстрации:

 const promiseOfIterator = await this.ctx.stub.getHistoryForKey(drugKey);
const results = [];
while(true){
 let res = await promiseOfIterator.next();
  //In the loop you have to check if the iterator has values or if its done 
  if(res.value){do your actions} 
  if(res.done){
   // close the iterator 
   await promiseOfIterator.close()
   // exit the loop
   return results
   }
}
  

Проверьте документацию Mozilla для получения дополнительной информации об итераторах в Javascript. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators

Комментарии:

1. res и результаты одинаковы?

2. Привет, нет, я имел в виду ваш результирующий массив. Я отредактировал ответ.