错误:需要资源或概念 [英] Error: Expected a Resource or Concept
本文介绍了错误:需要资源或概念的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当我尝试在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 transactionAgreement
/*
* 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屋!
查看全文