Hyperledger fabric Hyperledger编写器-错误8:资源已耗尽
我在尝试更新与同一资产相关的两个资产时遇到错误。从HL Composer v0.18.1升级到v0.19.4后,我发现了错误 以下是模型: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
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的字符串来解决此问题。