hyperledger composer 部署示例代码失败

hyperledger composer deploy example code fails

目前正在使用最新版本的 hyperledger 开发环境,并且正在使用管理服务。 admin -> deploy 的示例代码记录为:

// Deploy a Business Network Definition
var adminConnection = new AdminConnection();
var businessNetworkDefinition = BusinessNetworkDefinition.fromArchive(myArchive);
return adminConnection.deploy(businessNetworkDefinition)
.then(function(){
    // Business network definition deployed
})
.catch(function(error){
    // Add optional error handling here.
});

在提供的代码中,第二行失败,因为 BusinessNetworkDefinition 不是 composer-admin 节点模块的一部分。我有两种创建 BusinessNetworkDefinition 的选择,一种是使用 composer-client。失败并显示以下消息:TypeError: composerClient.BusinessNetworkDefinition is not a constructor 此处总结了用于此尝试的代码:

'use strict';
var fs = require('fs');
var path = require('path');
var composer = require('composer-admin');
var composerClient = require('composer-client');
var composerCommon = require('composer-common');

    var businessNetworkDefinition = new composerClient.BusinessNetworkDefinition();

另一种选择是使用 composer-common,它失败并显示以下消息:TypeError: businessNetworkDefinition.fromArchive is not a function 用于此尝试的代码是:

var fs = require('fs');
var path = require('path');
var composer = require('composer-admin');
var composerClient = require('composer-client');
var composerCommon = require('composer-common');

    var net_identifier = "zerotoblockchain-network@0.1.6";
    var net_description = "Z2B network";
    var net_package = require("../../../../network/package.json");
    var net_readme = "../../../../README.md";

    var businessNetworkDefinition = new composerCommon.BusinessNetworkDefinition(net_identifier, net_description, net_package, net_readme);
    var archive = businessNetworkDefinition.fromArchive(req.body.myArchive);

其中 req.body.myArchive 是要在 fromArchive 方法中使用的存档文件的名称。检查通过 new 命令创建的 BusinessNetworkDefinition 显示以下内容:

object property: modelManager
object property: aclManager
object property: queryManager
object property: scriptManager
object property: introspector
object property: factory
object property: serializer
object property: metadata

那么,两个问题:

hyperledger composer 文档中的示例代码存在缺陷。以下是将成功执行业务网络部署的代码。 (1) 要求的定义:

let fs = require('fs');
let path = require('path');
let composerAdmin = require('composer-admin');
const BusinessNetworkDefinition = require('composer-common').BusinessNetworkDefinition;

以下是在nodejs中作为可导出、可路由的例程编写的,并且已经通过客户端(浏览器)进行了测试。客户端传入要部署的网络名称。文件布局为:

root/network/dist/network-archive-file.bna

(2) 读取存档文件并创建管理员连接:

/**
 * Deploys a new BusinessNetworkDefinition to the Hyperledger Fabric. The connection must be connected for this method to succeed.
 * @param {express.req} req - the inbound request object from the client
 *  req.body.myArchive: _string - string name of object
 *  req.body.deployOptions: _object - string name of object
 * @param {express.res} res - the outbound response object for communicating back to client
 * @param {express.next} next - an express service to enable post processing prior to responding to the client
 * returns composerAdmin.connection - either an error or a connection object
 * @function
 */
exports.deploy = function(req, res, next) {

    let newFile = path.join(path.dirname(require.main.filename),'network/dist',req.body.myArchive);
    let archiveFile = fs.readFileSync(newFile);

    let adminConnection = new composerAdmin.AdminConnection();

(3) 调用(异步)fromArchive 函数,然后部署 fromArchive 调用的结果。

return BusinessNetworkDefinition.fromArchive(archiveFile)
    .then(function(archive) {
        adminConnection.connect(config.composer.connectionProfile, config.composer.adminID, config.composer.adminPW)
        .then(function(){
            adminConnection.deploy(archive)

(4)。响应(基于浏览器的)请求:

           .then(function(){
                console.log('business network deploy successful: ');
                res.send({deploy: 'succeeded'});
            })
            .catch(function(error){
                console.log('business network deploy failed: ',error);
                res.send({deploy: error});
                });

... (5) 对于复制所有代码的任何人,一些右大括号:

        });
    });
};