错误:需要资源或概念 [英] Error: Expected a Resource or Concept

查看:70
本文介绍了错误:需要资源或概念的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试在composer-playground中执行事务时,收到错误消息"getAssetRegistry返回null,并且错误消息显示未定义assetRegistry"

When I try to execute the transaction in composer-playground I got an error "getAssetRegistry is returning null and the error message says assetRegistry is not defined"

/*这是我的.cto文件:*/

/*Here is my .cto file: */

 namespace org.acme.payrent
  participant Authority identified by authorityId  {
      o String authorityId
  }

participant Tenant identified by tenantEmailId {
  o String tenantEmailId regex =/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/
  o String tFirstName
  o Address Address
  o TBankDetails tBank
  o Integer accountNo 
}

participant Owner identified by ownerEmailId {
  o String ownerEmailId regex =/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/
  o String name
  o String number regex=/^[0-9]*$/
  o Integer bankaccountno
  o Address propAddress
  --> Tenant tnt
}

participant Bank identified by bankID {
  o String bankID
  o TBankDetails tBank
}

asset Property identified by propAddress {
  o String propAddress
  o Address propActAddress
  o String tenantName
  o Double rentAmount
}

 concept Address {
  o String houseNumber
  o String street
  o String city 
  o String country
}

concept TBankDetails {
  o String bankName
  o String ifscCode
  o String branchName
}

concept Contact {
  o String email regex =/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/
  o String mobileNumber regex=/^[0-9]*$/
  o String firstName
  o String lastName
}

event E1{
o String email
o String mobileNumber regex=/^[0-9]*$/
o String tntName
o TBankDetails tntBankDetails
o Address propertyAddress
}

transaction Agreement{
  --> Property property
  o String owrName
  o String tntName
  o String email
  o String propAddress
  o String mobileNumber
  o String bankName
  o String ifscCode
  o String branchName
}`

/* chaincode/logic.js文件:*/ `/** *订购车辆 * @param {org.acme.payrent.Agreement}创建协议交易 * @交易 */

/* chaincode/logic.js file: */ ` /** * Place an order for a vehicle * @param {org.acme.payrent.Agreement} the Create Agreement transaction * @transaction */

function Agreement(tntObj)
{
  debugger
    var factory = getFactory(tntObj);
    var Namespace = "org.acme.payrent";
    var property = tntObj.propAddress;
    var addTntEvent = factory.newEvent(Namespace, 'E1');
    addTntEvent.email = tntObj.email;
    addTntEvent.mobileNumber  = tntObj.mobileNumber ;
    addTntEvent.tntName = tntObj.tntName;
    addTntEvent.tntBankName = tntObj.bankName;
    addTntEvent.ifscCode = tntObj.ifscCode;
    addTntEvent.branchName = tntObj.branchName;
    var a = getAssetRegistry('org.acme.payrent.Property');
    return getAssetRegistry('org.acme.payrent.Property')
                            .then(function(propertyRegistry){
                                return assetRegistry.update(property); });
}`

Access control file:permission.acl
`/**
 * New access control file
 */
rule Default {
    description: "Allow all participants access to all resources"
    participant: "ANY"
    operation: ALL
    resource: "org.acme.payrent.*"
    action: ALLOW
}

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

rule Owner {
     description: "Owner can add a Tenant"
     participant: "org.hyperledger.composer.system.Participant"
     operation: ALL
     resource: "org.hyperledger.composer.system.**"
     action: ALLOW
 }

 rule Bank {
     description: "Bank can verify tenant's bank account"
     participant: "org.hyperledger.composer.system.Participant"
     operation: ALL
     resource: "org.hyperledger.composer.system.**"
     action: ALLOW
 }

 rule Govenment {
     description: "To verify property belongs to owner"
     participant: "org.hyperledger.composer.system.Participant"
     operation: ALL
     resource: "org.hyperledger.composer.system.**"
     action: ALLOW
 }`

推荐答案

您的代码存在许多问题

  • 预期的资源或概念的最初问题是后者-未能正确提供给活动
  • 分配给property时使用了错误的对象,因此您的assetRegistry更新无法正常工作
  • 分配给事件字段时,您需要定义概念值-参见代码
  • 已离开console.logs,因此您可以看到输出
  • 您需要为您的交易提供更多数据(例如,概念地址字段)
  • 下面有一个rentAmount分配-您需要将其删除-这样您就可以看到Property资产已被更新,因为交易Agreement
  • the original issue of expected Resource or Concept was the latter - this wasn't being supplied correctly to the Event
  • you were using the wrong object when assigning to property so your assetRegistry update would not work
  • you need to define the Concept values when you assign to your event fields - see code
  • have left in console.logs so you can see the output
  • you need to provide more data (eg, Concept Address fields) to your transaction
  • there is a rentAmount assignment below - you need to remove - its there so you can see that the Property Asset has been updated as it should be by the transaction Agreement


/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * Sample transaction processor function.
 * @param {org.acme.payrent.Agreement} tntObj The sample transaction instance.
 * @transaction
 */

function Agreement(tntObj)
{

    var factory = getFactory();
    var Namespace = "org.acme.payrent";
    var property = tntObj.property;   // please note
    console.log('property is ' + property);
    var addTntEvent = factory.newEvent(Namespace, 'E1');
    addTntEvent.email = tntObj.email;

    addTntEvent.mobileNumber  = tntObj.mobileNumber ;
    addTntEvent.tntName = tntObj.tntName;

    var tntBankDetails = factory.newConcept(Namespace, 'TBankDetails');

    tntBankDetails.bankName = tntObj.bankName;
    tntBankDetails.ifscCode = tntObj.ifscCode;
    tntBankDetails.branchName = tntObj.branchName;

    addTntEvent.tntBankDetails = tntBankDetails;

    var conceptAddress = factory.newConcept(Namespace, 'Address');

    conceptAddress.houseNumber = '10';
    conceptAddress.street = '20';
    conceptAddress.city = 'Mainz';
    conceptAddress.country = 'DE';

    addTntEvent.propertyAddress = conceptAddress;

    emit(addTntEvent);



    //remove this! var a = getAssetRegistry('org.acme.payrent.Property');

    property.rentAmount =44.22 ; /// so you can see the value change on the asset in playground etc

    return getAssetRegistry('org.acme.payrent.Property')
                            .then(function(propertyRegistry) {
                                return propertyRegistry.update(property); 
    });
}

这篇关于错误:需要资源或概念的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆