#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. Привет, нет, я имел в виду ваш результирующий массив. Я отредактировал ответ.