Blockchain 结构编写器测试代码不工作

Blockchain 结构编写器测试代码不工作,blockchain,hyperledger,hyperledger-fabric,hyperledger-composer,Blockchain,Hyperledger,Hyperledger Fabric,Hyperledger Composer,为了更好地理解,我刚刚用我创建的另一个示例替换了Composer默认示例(“Samplesset”、“sampleTransaction”等)。除了返回错误消息的事务外,所有操作都正常: “**错误:找不到要为事务处理org.acme.sample.compradovino执行的任何函数#**2b2d0624 bc…” 以下是源代码: 大宗报价 模型文件: 名称空间org.acme.sample IDvinho确定的资产Vinho{ o String IDvinho --> Partici

为了更好地理解,我刚刚用我创建的另一个示例替换了Composer默认示例(“Samplesset”、“sampleTransaction”等)。除了返回错误消息的事务外,所有操作都正常: “**错误:找不到要为事务处理org.acme.sample.compradovino执行的任何函数#**2b2d0624 bc…”

以下是源代码:

大宗报价

模型文件: 名称空间org.acme.sample

IDvinho确定的资产Vinho{

o String IDvinho
--> Participante owner
o String uva
o String nomeVinho 
o Integer preco 
}

由IDP参与者识别的参与者参与者{

o String IDparticipante
o String tipo
o String nomeEmpresa
}

IDcompra识别的交易Compradovino{

o String IDcompra
--> Vinho asset
o Integer precoVenda
}

逻辑: 采样传输功能(Compradovino){

}

权限: 规则默认值{

description: "Allow all participants access to all resources"
participant: "ANY"
operation: ALL
resource: "org.acme.sample"
action: ALLOW
}

大宗报价

有人能帮我找到代码中的错误吗


提前感谢

问题几乎可以肯定,因为您已经重命名了事务。Composer有两种机制将事务路由到JS函数:

  • (遗留)使用
    onMyTransactionType
    命名约定。即,当提交
    MyTransactionType
    的实例时,将调用该函数
  • (首选)使用
    @transaction
    @param
    注释。请参见下面的示例。
    @transaction
    注释表示函数希望处理事务,而
    @param
    注释用于指定要处理的事务的类型
  • /** *订购车辆 *@param{org.acme.vehicle.lifecycle.manufacturer.PlaceOrder}PlaceOrder-PlaceOrder事务 *@交易 */ 函数placeOrder(placeOrder){ console.log('placeOrder'); 让factory=getFactory(); 设NS='org.acme.vehicle.lifecycle.manufacturer'; 让order=factory.newResource(NS,'order',placeOrder.transactionId); order.vehicleDetails=placeOrder.vehicleDetails; order.orderStatus='PLACED'; order.manufacturer=placeOrder.manufacturer; //保存订单 返回getAssetRegistry(order.getFullyQualifiedType()) .then(功能(注册表){ 返回注册表。添加(订单); }); }
    请用以下代码替换
    logic.js
    文件中的代码,错误肯定会消失。我的问题也是一样,我只是在函数上方添加了所需的
    JS文档注释
    ,同样的问题得到了解决

    'use strict';
    var NS = 'org.acme.sample';
    /**
     * @param {org.acme.sample} CompraDoVinho 
     * @transaction
     */
    function onSampleTransaction(CompraDoVinho) {
    
    CompraDoVinho.asset.preco = CompraDoVinho.precoVenda;
    
    return getAssetRegistry('org.acme.sample.Vinho')
    
        .then(function (assetRegistry) {
    
            return assetRegistry.update(CompraDoVinho.asset);
    
      });
    }
    

    希望这对你有帮助

    当然。注释对于函数的工作至关重要! @param必须说明事务的类名和param名称 @下面声明了事务,在下面的块中跟随函数

    @param{org.acme.mynetwork.Foo}Foo-要处理的报告
    *@transaction

    很有趣。我不知道这样的惯例规则。我刚刚将“Compradovino”替换为“onSampleTransaction”,但它仍然不起作用。还有别的想法吗?现在谢谢了。我想应该是onCompraDoVinho,不过使用注释方法要好得多。我也有同样的问题。我做了一个名为“卖出”的新交易,我没有将
    @param
    从交易更改为卖出
    @param{org.acme.mynetwork.Sell}
    在看似注释的内容中包含
    @param
    是非常误导的。@Dan什么是getFactory()方法?getFactory用于创建资产、参与者、事务、事件等的实例。 /** * Place an order for a vehicle * @param {org.acme.vehicle.lifecycle.manufacturer.PlaceOrder} placeOrder - the PlaceOrder transaction * @transaction */ function placeOrder(placeOrder) { console.log('placeOrder'); let factory = getFactory(); let NS = 'org.acme.vehicle.lifecycle.manufacturer'; let order = factory.newResource(NS, 'Order', placeOrder.transactionId); order.vehicleDetails = placeOrder.vehicleDetails; order.orderStatus = 'PLACED'; order.manufacturer = placeOrder.manufacturer; // save the order return getAssetRegistry(order.getFullyQualifiedType()) .then(function (registry) { return registry.add(order); }); }
    'use strict';
    var NS = 'org.acme.sample';
    /**
     * @param {org.acme.sample} CompraDoVinho 
     * @transaction
     */
    function onSampleTransaction(CompraDoVinho) {
    
    CompraDoVinho.asset.preco = CompraDoVinho.precoVenda;
    
    return getAssetRegistry('org.acme.sample.Vinho')
    
        .then(function (assetRegistry) {
    
            return assetRegistry.update(CompraDoVinho.asset);
    
      });
    }