2017-12-27 984 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塊來處理返回的值,然後才能更新它。