.update 和 .updateAll 未按需运行

.update and .updateAll not functioning as needed

我正在 Composer 上构建一个应用程序,它与 Playground 上的示例 Bond 网络非常相似。我的部分申请要求在到期日删除过时的合同。因此,代码必须获取所有合同,找到日期小于当前日期的合同,并将它们的 valid 字段更改为 false。下面是我 运行:

的一些代码
function SOD(sod) {  // eslint-disable-line no-unused-vars

return getAssetRegistry('org.acme.otc.LiveContract')
.then(function (contractRegistry){

    return contractRegistry.getAll();
})
.then(function (l){
    allContracts=l;
    //console.log('Curr List: ',allContracts);
    var q = new Date();
    var m = q.getMonth();
    var d = q.getDay();
    var y = q.getFullYear();
    var date = new Date(y,m,d);
    var arr=[];
    allContracts.forEach(function(contract) {
      //console.log('Contract Date: ',contract.contract.expiry);
      if (contract.contract.expiry<date) {
        //console.log('Checks Out');
        //console.log('Destroying: ',contract);

        arr.push(contract);
        //console.log('Return: ',x);
      } 
    }) 
return arr
}).then( function(arr){
    var factory = getFactory();
    new_arr=[];

    fLen = arr.length;
    for (i = 0; i < fLen; i++) {
        var old_contract=arr[i];
        console.log('ISIN: ',old_contract.ISINcode);
        var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
        console.log('Entry: ',old_contract);
        new_contract.contract=old_contract.contract;
        new_contract.valid=false;
        new_arr.push(new_contract);


    } x=invalidate(new_arr);
});

现在,生成 new_arr 的代码运行良好。我可以在 Playground 中检查并得到以下日志 new_arr:

New Array

但是,当我在 new_arr 上调用 invalidate on 或在 SOD 中复制该代码时,不会发生对注册表的预期影响。我在 valid 字段下没有得到 false。当我尝试在调试器中读入 x 时,我得到了 limp-wristed Promise 响应:

Ugh

这是我的 .cto 和 .acl 文件:

//otc.cto

    namespace org.acme.otc

    participant Trader identified by traderId {
      o String traderId
      o String name
      o Boolean marginThresh // margin meeting maintenance minimum
    }
    participant Administrator identified by adminId {
      o String adminId
      o Boolean tradingOpen 
    }

    enum Product {
      o OPTION
      o FUTURE
      o FORWARD
    }

    concept Order {
      o String traderID
        o Product productType
        o String asset // commodity? underlying? - may later need typing
        o Boolean buy
        o Double notionalAmount
        o DateTime expiry // only needs to specify date
    }

    concept Contract {
      o String buyerID // buyer/seller vs maker/taker?
        o String sellerID
        o Product productType
        o String asset // commodity? underlying? - may later need typing
        o Double notionalAmount
        o Double value
        o DateTime expiry
    }

    asset OpenOrder identified by ISINcode {
      o String ISINcode
        o Order order
        o Boolean valid
    }

    asset LiveContract identified by ISINcode {
      o String ISINcode
        o Contract contract
        o Boolean valid
    }

    transaction PlaceOrder {
      o String ISINCode
      o Order order
    }
    transaction SOD {
      o String adminId
    }
    transaction Test {}

//permissions.acl

  rule Issuer {
      description: "Allow full access to the issuer of a bond"
      participant(i): "org.acme.otc.Trader"
      operation: ALL
      resource(a): "org.acme.otc.OpenOrder"
      condition: (a.bond.issuer.memberId === i.memberId)
      action: ALLOW
  }

  rule Default {
      description: "Allow read access"
      participant: "org.acme.otc.*"
      operation: ALL
      resource: "org.acme.otc.*"
      action: ALLOW
  }

  rule SystemACL {
      description:  "System ACL to permit all access"
      participant: "org.hyperledger.composer.system.Participant"
      operation: ALL
      resource: "org.hyperledger.composer.system.**"
      action: ALLOW
  }

  rule NetworkAdminUser {
      description: "Grant business network administrators full access to user resources"
      participant: "org.hyperledger.composer.system.NetworkAdmin"
      operation: ALL
      resource: "**"
      action: ALLOW
  }

  rule NetworkAdminSystem {
      description: "Grant business network administrators full access to system resources"
      participant: "org.hyperledger.composer.system.NetworkAdmin"
      operation: ALL
      resource: "org.hyperledger.composer.system.**"
      action: ALLOW
  }

我在 JavaScript 方面经验不足,所以错误可能很小。感谢您的帮助。

更新: 我正在处理 Paul 的回复。我的新代码如下

/**
 * Start of Day Update
 * @param {org.acme.otc.SOD} sod - the sod transaction
 * @transaction
 */
function SOD(sod) {  // eslint-disable-line no-unused-vars
  //arr=pare();
  var aR=null;
  return getAssetRegistry('org.acme.otc.LiveContract')
    .then(function (contractRegistry){
        ar=contractRegistry;
        return ar.getAll();
  })
    .then(function (l){
        allContracts=[];
        allContracts=l;
        console.log('Curr List: ',allContracts);
        var q = new Date();
        var m = q.getMonth();
        var d = q.getDay();
        var y = q.getFullYear();
        var date = new Date(y,m,d);
        console.log('Current Date: ',date);
        arr=[];
        allContracts.forEach(function(contract) {
          //console.log('Contract Date: ',contract.contract.expiry);
          if (contract.contract.expiry<date) {
            //console.log('Checks Out');
            //console.log('Destroying: ',contract);

            arr.push(contract);
            //console.log('Return: ',x);
          } 
        }) 
    return arr
    }).then( function(arr){
        var factory = getFactory();
        new_arr=[];

        fLen = arr.length;
        for (i = 0; i < fLen; i++) {
            var old_contract=arr[i];
            console.log('ISIN: ',old_contract.ISINcode);
            var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
            console.log('Entry: ',old_contract);
            new_contract.contract=old_contract.contract;
            new_contract.valid=false;
            new_arr.push(new_contract);


        } 
    console.log(new_arr);
  });
  console.log("getting to update the records");
  return  aR.updateAll(new_arr);

}

然而它不起作用。代码似乎永远不会达到最终的 console.log。之前的日志没有问题,里面的新合约是正确的。现在有什么想法吗?

没有看到 updateAll 代码位,也不知道 invalidate(new_arr) 有什么功能 - 所以我会 post 类似的东西,但你明白了要点 - 它在 Playground 中有效。 updateupdateAll 都适合我。

我在下面粘贴了工作代码 - 只是从您的命名空间等中给了它一个事务/TP 装饰器。

更新: (我原来的 post 我会离开这里 - 因为它有效) - 我还更新了你的第二个新代码块的工作版本 - 但有更正,例如。你没有正确引用对象(比如 ar 而不是 aR 所以它永远不会更新注册表等)并且 - 你需要遵循 JS 承诺链,使用你的方式完成了 - 所以我在下面的 'ANSWER 2' 中为您添加了该代码。)。另外,可能最好声明 new_arr 具有全局函数范围,我已经在我的代码中做到了。

/**
 * New script file
 */

/**
* A transaction processor function description
* @param { org.acme.otc.SOD } sod A human description of the parameter
* @transaction
*/

function SOD(sod) {  // eslint-disable-line no-unused-vars

  var aR = null;

  return getAssetRegistry('org.acme.otc.LiveContract')
  .then(function (contractRegistry){
     // return contractRegistry.getAll();
      aR = contractRegistry;
      return aR.getAll();
  })
  .then(function (l) {

      allContracts=[];
      allContracts=l;

      console.log('allContracts List is: ' + allContracts );

      var q = new Date();
      var m = q.getMonth();
      var d = q.getDay();
      var y = q.getFullYear();
      var datevar = new Date(y,m,d);
      arr=[];

      allContracts.forEach(function(contract) {
      console.log('Contract Date: ' + contract.contract.expiry);

      if (contract.contract.expiry < datevar ) {
      console.log('Checks Out - this contract needs fixing');
      console.log('Destroying: ' + contract);

      arr.push(contract);
      //console.log('Return: ',x);
      } 
    }) 
  return arr
  })
  .then( function(arr) {
      var factory = getFactory();
      new_arr=[];

      fLen = arr.length;
      for (i = 0; i < fLen; i++) {
          var old_contract=arr[i];
          console.log('ISIN: ' + old_contract.ISINcode);
          var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
          console.log('Entry: ' + old_contract);
          new_contract.contract=old_contract.contract;
          new_contract.valid=false;
          new_arr.push(new_contract);


       }  // x=invalidate(new_arr);


   });

   console.log("getting to update the records");
   return  aR.updateAll(new_arr);
    //.then(function () {

       // return getAssetRegistry('org.acme.otc.LiveContract')
       //.then(function (contractRegistry){

       //  return contractRegistry.updateAll(new_arr);

    // });
   //});
}

答案 2:使用您的第二个代码块更新了代码

/**
 * Start of Day Update
 * @param {org.acme.otc.SOD} sod - the sod transaction
 * @transaction
 */
function SOD(sod) {  // eslint-disable-line no-unused-vars
  //arr=pare();

  var aR=null;
  new_arr=[]; 

  return getAssetRegistry('org.acme.otc.LiveContract')
    .then(function (contractRegistry){
        aR=contractRegistry;
        return aR.getAll();

  })
    .then(function (l){
        allContracts=[];
        allContracts=l;
        console.log('Curr List: ',allContracts);
        var q = new Date();
        var m = q.getMonth();
        var d = q.getDay();
        var y = q.getFullYear();
        var date = new Date(y,m,d);
        console.log('Current Date: ',date);
        arr=[];
        allContracts.forEach(function(contract) {
          //console.log('Contract Date: ',contract.contract.expiry);
          if (contract.contract.expiry < date) {
            //console.log('Checks Out');
            //console.log('Destroying: ',contract);

            arr.push(contract);
          //console.log('Return: ',x);
          } 
        }) 
    return arr
    }).then( function(arr){
        var factory = getFactory();

        //new_arr=[];

        fLen = arr.length;
        for (i = 0; i < fLen; i++) {
            var old_contract=arr[i];
            console.log('ISIN: ',old_contract.ISINcode);
            var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
            console.log('Entry: ',old_contract);
            new_contract.contract=old_contract.contract;
            new_contract.valid=false;
            new_arr.push(new_contract);


        } 
       console.log("New Array is now " + new_arr);
  })
   .then(function () {

      console.log("getting to update the records");
      return  aR.updateAll(new_arr);
   });
}