【问题标题】:Adding relationships to an array of relationships in hyperledger-composer将关系添加到 hyperledger-composer 中的关系数组
【发布时间】:2018-06-25 19:09:42
【问题描述】:

在我的超级账本作曲家应用程序中,我有客户和顾问。客户对已添加到他/她的“readAccessList”中的顾问具有读取权限。

以下是这两种参与者类型的模型:

participant Client identified by id {
  o String id
  o String name
  --> Consultant[] readAccessList optional
}

participant Consultant identified by id {
  o String id
  o String name
  o String text
}

将顾问添加到客户的readAccessList的事务定义如下:

transaction AddToReadableConsultantsOfClient {
  --> Client client
  --> Consultant[] newReadableConsultants
}

本次交易的交易处理函数如下:

/**
 * transaction AddToReadableConsultantsOfClient
 * @param {org.comp.myapp.AddToReadableConsultantsOfClient} transaction
 * @transaction
 */
async function addToReadableConsultantsOfClient(transaction) {

    // Save the old version of the client:
    const clientOld = transaction.client;

    // Update the client with the new readableConsultants:
    transaction.client.readAccessList.concat(transaction.newReadableConsultants);    

    // Get the participant registry containing the clients:
    const participantRegistry = await getParticipantRegistry('org.comp.myapp.Client');

    // Update the client in the participant registry:
    await participantRegistry.update(transaction.client);

    // Emit an event for the modified client:
    let event = getFactory().newEvent('org.comp.myapp', 'ClientUpdated');
    event.clientOld = clientOld;
    event.clientNew = transaction.client;
    emit(event);

}

在我的 Angular 应用程序中,我尝试使用以下代码将几个顾问添加到客户端的 readAccessList 中:

//Note that the consultants referred to in the following array do actually exist:
let consultants = ["resource:org.comp.myapp.Consultant#1", "resource:org.comp.myapp.Consultant#2"];

this.transaction = {
  $class: "org.comp.myapp.AddToReadableConsultantsOfClient",       
      "client": "resource:org.comp.myapp.Client#" + this.clientId,
      "newReadableConsultants": consultants,
      "timestamp": new Date().getTime()
};

return this.addToReadableConsultantsOfClientService.addTransaction(this.transaction)
.toPromise()
.then(() => {
  this.errorMessage = null;
})
.catch((error) => {
    if(error == 'Server error'){
      this.errorMessage = "Could not connect to REST server. Please check your configuration details.";
    }
    else if(error == '404 - Not Found'){
      this.errorMessage = "404 - Could not find API route. Please check your available APIs."
    }
    else{
      this.errorMessage = error;
    }
});

由于某种原因,这不起作用。顾问不会被添加到客户端的“readAccessList”中(保持为空)。

在控制台中,我收到一条奇怪的错误消息,内容如下:

Error: 2 UNKNOWN: error executing chaincode: transaction returned with failure: ReferenceError: org is not defined

我将关系添加到关系数组的方法有什么问题?

【问题讨论】:

  • readAccessList 本身就是一种关系......我认为这就是它不起作用的原因......但我在文档中没有找到关于如何做你想做的事情的任何内容跨度>

标签: hyperledger-composer relationships


【解决方案1】:

我更改了您的交易脚本的 1 行:

transaction.client.readAccessList.concat(transaction.newReadableConsultants);

transaction.client.readAccessList=transaction.client.readAccessList.concat(transaction.newReadableConsultants);

我在 Composer Playground 中测试,我使用的 JSON 数据是:

{
 "$class": "org.comp.myapp.AddToReadableConsultantsOfClient",
 "client": "resource:org.comp.myapp.Client#MBC01",
 "newReadableConsultants": [
  "resource:org.comp.myapp.Consultant#C02"
 ]
}

该事务现在可以在 Playground 中运行 - 但我尚未通过 Angular 应用程序进行测试。

【讨论】:

  • 感谢您的回答...我根据您的建议更改了交易处理器功能...但错误消息保持不变:“错误:2 UNKNOWN:执行链代码时出错:交易返回失败:ReferenceError:组织未定义”
  • 我不知道这是否是失败的原因,但您不应该将时间戳传递给事务(参见我的示例 json)。您是否在 Explorer 上测试过您的交易? (localhost:3000/explorer) ?
  • 来自angular app,我觉得需要时间戳……反正我也试过不带时间戳……报错信息是一样的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多