Hyperledger fabric Hyperledger编写器-错误8:资源已耗尽

Hyperledger fabric Hyperledger编写器-错误8:资源已耗尽,hyperledger-fabric,hyperledger,hyperledger-composer,Hyperledger Fabric,Hyperledger,Hyperledger Composer,我在尝试更新与同一资产相关的两个资产时遇到错误。从HL Composer v0.18.1升级到v0.19.4后,我发现了错误 以下是模型: asset Order identified by pullID { o String pullID --> PackCase caseNumber optional } asset PackCase identified by caseNumber{ o String caseNumber --> Order[] or

我在尝试更新与同一资产相关的两个资产时遇到错误。从HL Composer v0.18.1升级到v0.19.4后,我发现了错误

以下是模型:

asset Order identified by pullID {
  o String pullID
  --> PackCase caseNumber optional
}

asset PackCase identified by caseNumber{
    o String caseNumber
    --> Order[] orders optional
}
我想将Order1和Order2关联到Packcase1。为此,我在transaction processor中使用此方法,它将订单插入packcase.orders数组,并同时更新order.casenumber的引用:

function AssociatePackCaseToOrder(tx){

    tx.order.caseNumber = tx.packCase;
    tx.packCase.orders.push(tx.order);

    return getAssetRegistry(namespaceAsset+'.Order')
    .then(function(ordersRegistry){
        return ordersRegistry.update(tx.order)
        .then(function(){
            console.info("Order Updated");
            return getAssetRegistry(namespaceAsset+'.PackCase')
            .then(function(packCaseRegistry){
                return packCaseRegistry.update(tx.packCase)
                .then(function(){
                    console.info("PackCase Updated");
                })
            })
        })
    })
}
但是,当我尝试连续两次调用此方法时,会出现以下错误:

Error trying invoke business network. Error: No valid responses from any peers.\nResponse from attempted peer comms was an error:
Error: 8 RESOURCE_EXHAUSTED: received trailing metadata size exceeds limit",
"stack":"Error: Error trying invoke business network. Error: No valid responses from any peers.
Response from attempted peer comms was an error: Error: 8 RESOURCE_EXHAUSTED: received trailing metadata size exceeds limit
at _initializeChannel.then.then.then.then.catch (/usr/lib/node_modules/composer-rest-server/node_modules/composer-connector-hlfv1/lib/hlfconnection.js:967:34)
at <anonymous>
尝试调用业务网络时出错。错误:没有来自任何对等方的有效响应。\n来自尝试的对等方通信的响应是一个错误: 错误:8资源\u耗尽:收到的尾随元数据大小超过限制“, “堆栈”:“错误:尝试调用业务网络时出错。错误:没有来自任何对等方的有效响应。 来自尝试的对等通信的响应为错误:错误:8资源\u耗尽:接收到的尾随元数据大小超出限制 在@u initializeChannel.then.then.then.catch(/usr/lib/node_modules/composer rest server/node_modules/composer-connector-hlfv1/lib/hlfconnection.js:967:34) 在
有人知道错误的原因吗?

我认为代码中有问题,资源耗尽(可能来自grpc消息大小限制)-可能是将对象分配给字符串的第一行

当前(尽管您尚未发布事务模型),您正在尝试将订单(或集合)与PackCase关联-您的代码一次显示一个事务(您更新每个资源的注册表)。下面显示的代码将casenumber引用添加到订单中,并将订单ID(FQ标识符)推送到PackCase上的数组中

因此,对于这样的模型:

asset Order identified by pullID {
  o String pullID
  o String caseNumber optional
  --> PackCase packcase optional // this would make more sense naming-wise
}

asset PackCase identified by caseNumber {
    o String caseNumber
    --> Order[] orders optional    
    // o Order[] orders optional   // alternative, see below.
}

transaction acpto {
  --> Order order
  --> PackCase packCase
}
/**
     * Associate the Packcase to order
     * @param {org.acme.mynetwork.acpto} tx - the tx to be processed
     * @transaction
**/



function AssociatePackCaseToOrder(tx){

   var namespaceAsset = 'org.acme.mynetwork';
    tx.order.caseNumber = tx.packCase.getIdentifier(); // eg. '1'
   console.log(" case ref is " +  tx.packCase.getIdentifier() ); 
   console.log(" order ref is " +  tx.order.getIdentifier() );

 //  tx.order.pullID  = tx.order.getIdentifier(); // because its a relationship, will still have the FQ identifer hence commented out FYI


    if(tx.packCase.orders == null) {
        tx.packCase.orders  = []; // initialise
    }

    tx.packCase.orders.push(tx.order);

    return getAssetRegistry(namespaceAsset+'.Order')
    .then(function(ordersRegistry){
        return ordersRegistry.update(tx.order)
        .then(function(){
            console.info("Order Updated");
            return getAssetRegistry(namespaceAsset+'.PackCase')
            .then(function(packCaseRegistry){
                return packCaseRegistry.update(tx.packCase)
                .then(function(){
                    console.info("PackCase Updated");
                })
            })
        })
    })
}
您的交易代码如下所示:

asset Order identified by pullID {
  o String pullID
  o String caseNumber optional
  --> PackCase packcase optional // this would make more sense naming-wise
}

asset PackCase identified by caseNumber {
    o String caseNumber
    --> Order[] orders optional    
    // o Order[] orders optional   // alternative, see below.
}

transaction acpto {
  --> Order order
  --> PackCase packCase
}
/**
     * Associate the Packcase to order
     * @param {org.acme.mynetwork.acpto} tx - the tx to be processed
     * @transaction
**/



function AssociatePackCaseToOrder(tx){

   var namespaceAsset = 'org.acme.mynetwork';
    tx.order.caseNumber = tx.packCase.getIdentifier(); // eg. '1'
   console.log(" case ref is " +  tx.packCase.getIdentifier() ); 
   console.log(" order ref is " +  tx.order.getIdentifier() );

 //  tx.order.pullID  = tx.order.getIdentifier(); // because its a relationship, will still have the FQ identifer hence commented out FYI


    if(tx.packCase.orders == null) {
        tx.packCase.orders  = []; // initialise
    }

    tx.packCase.orders.push(tx.order);

    return getAssetRegistry(namespaceAsset+'.Order')
    .then(function(ordersRegistry){
        return ordersRegistry.update(tx.order)
        .then(function(){
            console.info("Order Updated");
            return getAssetRegistry(namespaceAsset+'.PackCase')
            .then(function(packCaseRegistry){
                return packCaseRegistry.update(tx.packCase)
                .then(function(){
                    console.info("PackCase Updated");
                })
            })
        })
    })
}
您的方法:
-->Order[]orders可选

{
      "$class": "org.acme.mynetwork.PackCase",
      "caseNumber": "5",
      "orders": [
        "resource:org.acme.mynetwork.Order#1",
        "resource:org.acme.mynetwork.Order#2",
        "resource:org.acme.mynetwork.Order#3"
      ]
    }
备选方案<代码>订单[]订单可选:

提交订单1、订单2和订单3的3笔交易后,您将在PackCase资产中获得以下信息:

{
  "$class": "org.acme.mynetwork.PackCase",
  "caseNumber": "3",
  "orders": [
    {
      "$class": "org.acme.mynetwork.Order", 
      "pullID": "1",
      "caseNumber": "3"
    },
    {
      "$class": "org.acme.mynetwork.Order",
      "pullID": "2",
      "caseNumber": "3"
    }
    {
      "$class": "org.acme.mynetwork.Order",
      "pullID": "3",
      "caseNumber": "3"
    }
  ]
}

只需说明,订单案例编号将使用来自
PackCase

的案例参考编号进行更新,您可以粘贴
docker ps
命令的结果以及对等日志吗?感谢您的回答,我正在使用IBM Cloud区块链平台,无法检索正在运行的容器。对等日志可能会提供更多信息,否则我认为您需要联系IBM区块链平台支持以获得帮助。感谢您的回答,它帮助我找到了问题。我多次相互引用资产,创建了一个引用循环。因此,当我尝试在事务处理器中更新资产时,它无法处理对象。我通过将引用字段替换为包含资产ID的字符串来解决此问题。