更新现有资产 - Hyperledger Composer

Updating Existing Assets - Hyperledger Composer

我正在尝试在 composer 中创建一个简单的 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. 两个值被提供给脚本,一个贷款号和一个交易 数量。
  2. 脚本然后 returns 资产注册表和 returns 如果贷款编号已经存在,则为适当的 bool。
  3. 如果为 False(资产注册表中不存在贷款),将使用交易中的贷款编号和余额创建新资产。
  4. 如果为 True,则返回资产注册表,然后我使用 .get 函数并将结果设置为等于在脚本开始时创建的 loanToUpdate 变量。然后,我使用资产注册表上的 .update(loanToUpdate) 函数来更新现有资产。

当 bool 为 False 时,脚本可以正常工作并创建新资产,但是当 bool 为 True 且交易包含已存在的贷款编号时,我收到错误 "Error: Expected a Resource or Concept."

编辑

现在我在这方面有了更多的经验,我认为使用内置关系可以更容易地完成它,但是 post 我在下面更新的功能代码。

更新代码修复:

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);
                    })                             
        }
    })       

}

获得资产登记returns一个承诺,所以行 loanToUpdate = assetRegistry2.get(tx.loanNum) 需要成为承诺链的一部分,因此您需要一个 .then 块来处理返回值,然后才能更新它。