2017-12-27 203 views
0

我试图创建作曲家简单hyperledger chaincode,需要一个贷款数目,如果它存在,否则更新相关的资产创建一个新的资产。更新现有资产 - Hyperledger作曲家

我的模型文件看起来像这样:

asset Loan identified by loanNum{ 
    o String loanNum 
    o Double balance 
} 

transaction createTransaction { 
    o String loanNum 
    o Double transAmount 
} 

我的剧本是这样的:

function createTransaction(tx) { 
    var NS = 'org.acme.ra'; 
    var factory = getFactory(); 
    var loanToUpdate 

//returns all assets 
    return getAssetRegistry(NS + '.Loan') 
     .then(function(assetRegistry){ 
     return assetRegistry.exists(tx.loanNum); 
     }) 
     .then(function(exists){ 
      if (exists) { 
        return getAssetRegistry(NS + '.Loan')       
         .then(function(assetRegistry2){        
          loanToUpdate = assetRegistry2.get(tx.loanNum) 
          loanToUpdate.balance = tx.transAmount; 
          return assetRegistry2 
         }) 
         .then(function(updateAssetRegistry){ 
          return updateAssetRegistry.update(loanToUpdate)//broken right here 
        }) 
      } 
      else { 
        return getAssetRegistry(NS + '.Loan') 
         .then(function(assetRegistry2){ 
         var newLoan =factory.newResource(NS,'Loan',tx.loanNum); 
          newLoan.balance = tx.transAmount;       
          return assetRegistry2.add(newLoan); 
         })        
      } 
     })  

}

脚本摘要:

  1. 两个值提供给脚本,贷款编号和交易0金额为。
  2. 脚本然后返回资产注册,如果贷款数量已经存在返回 适当布尔。
  3. 如果(在资产注册表中存在贷款犯规)假,新的资产将利用从交易贷款和余额创建。
  4. 如果为True,则返回的资产注册表,然后我用不用彷徨功能,并设置结果等于在脚本的开始创建的loanToUpdate变量。然后,我使用资产注册表上的.update(loanToUpdate)函数来更新现有资产。

当布尔是假的脚本正常工作,并创建一个新的资产,但是当布尔是真实的,交易中包含已经存在我得到的错误贷款数量“错误:预期资源或概念”

编辑

现在,我得到更多的经验,这一点,我认为这是可以做到更容易与内置的关系,但低于生病后我更新的功能代码。

更新的代码与修复:

function createTransaction(tx) { 
    var NS = 'org.acme.ra'; 
    var factory = getFactory(); 
    var loanToUpdate 

//returns all assets 
    return getAssetRegistry(NS + '.Loan') 
     .then(function(assetRegistry){ 
     return assetRegistry.exists(tx.loanNum); 
     }) 
     .then(function(exists){ 
     if (exists) { 
       return getAssetRegistry(NS + '.Loan')      
        .then(function(assetRegistry2){        
        return assetRegistry2.get(tx.loanNum); 
       }) 
       .then(function(updateloan){ 
         loanToUpdate = updateloan      
         loanToUpdate.balance = tx.transAmount; 
         return getAssetRegistry(NS + '.Loan') 

       }) 
       .then(function(assetRegistry3){ 
         return assetRegistry3.update(loanToUpdate); 
       }) 
     } 
     else { 
       return getAssetRegistry(NS + '.Loan') 
        .then(function(assetRegistry2){ 

         var newLoan = factory.newResource(NS,'Loan',tx.loanNum);        
         newLoan.balance = tx.transAmount;       
         return assetRegistry2.add(newLoan); 
        })        
     } 
    })  

}

回答

0

获得的资产注册表返回一个承诺,所以行 loanToUpdate = assetRegistry2.get(tx.loanNum) 需要在承诺链的一部分,所以你需要一个.then块来处理返回的值,然后才能更新它。