2017-09-01 36 views
0

当前正在使用最新版本的hyperledger开发环境,并且正在通过管理服务进行工作。 admin的示例代码 - >部署被记录为:超级作曲作者部署示例代码失败

// 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不是作曲家管理员节点模块的一部分的第二行失败。我有两个创建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(); 

另一种选择是使用作曲家常见,它失败,出现以下消息: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 = "[email protected]"; 
    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 

于是,两个问题:

  • 一:什么是用new命令创建和
  • 二:如何正确地创建一个BusinessNetworkDefinition对象,其中作为fromArchive()的函数呢?

回答

0

在hyperledger作曲家文档中的示例代码是有缺陷的。以下是将成功执行业务网络部署的代码。 (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)和任何人复制所有的代码,有几个结束括号:

 }); 
    }); 
};