Hyperledger Composer报错:无法在字符串'resumedevelop'上创建'wallet'属性及事件订阅问题
解决Hyperledger Composer中的TypeError及事件订阅问题
一、修复TypeError: Cannot create property 'wallet' on string 'resumedevelop'
这个错误的核心问题是你错误地把字符串(推测是你的业务网络名称resumedevelop)直接传给了BusinessNetworkConnection的构造函数。BusinessNetworkConnection的构造函数接受的是可选的配置对象(比如自定义钱包配置),而非业务网络名称这类字符串。
错误场景(你大概率踩了这个坑):
// 错误写法:把业务网络名称直接塞给构造函数 var connection = new BusinessNetworkConnection('resumedevelop');
正确写法:
构造函数不传字符串参数(使用默认钱包),业务网络名称等信息放在connect方法里传入:
// 正确初始化:构造函数空参调用 var connection = new BusinessNetworkConnection(); // 后续调用connect时传入完整参数 await connection.connect( `${participantId}@resumedevelop`, // 业务网络标识符,格式为「参与者ID@业务网络名称」 participantPwd // 参与者密码 );
如果需要自定义钱包,构造函数才传配置对象:
const Wallet = require('composer-common').Wallet; // 自定义钱包示例(按需调整) var customWallet = new Wallet(...); var connection = new BusinessNetworkConnection({ wallet: customWallet });
二、完善事件订阅的event.js代码
你的代码只写了开头部分,下面是完整的事件订阅实现,包含连接网络、订阅事件、处理回调的全流程:
'use strict'; const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection; const winston = require('winston'); var chalk = require('chalk'); let config = require('config').get('event-app'); let participantId = config.get('participantId'); let participantPwd = config.get('participantPwd'); const LOG = winston.loggers.get('application'); async function startEventSubscription() { var connection = new BusinessNetworkConnection(); try { // 1. 连接到目标业务网络 const networkDefinition = await connection.connect( `${participantId}@resumedevelop`, participantPwd ); LOG.info(chalk.green(`成功连接到业务网络: ${networkDefinition.getName()}`)); // 2. 获取事件服务实例 const eventService = networkDefinition.getEventService(); // 3. 订阅指定事件(替换成你实际定义的事件类型,比如'org.yourdomain.YourEvent') const subscription = await eventService.subscribe('org.example.MyEvent', (event) => { // 收到事件后的处理逻辑 LOG.info(chalk.blue(`捕获到事件: ${event.$type}`)); console.log('事件详情:', event); // 这里可以添加业务逻辑,比如更新数据库、发送通知等 }); LOG.info(chalk.yellow('事件订阅已启动,持续监听中...')); // 可选:如需取消订阅,调用下面的方法(示例为30秒后取消) // setTimeout(() => { // subscription.unsubscribe(); // LOG.info(chalk.yellow('已取消事件订阅')); // }, 30000); } catch (error) { LOG.error(chalk.red(`连接或订阅失败: ${error.message}`)); throw error; } } // 启动订阅流程 startEventSubscription();
关键注意事项:
- 确保
participantId的格式正确,或者直接用${participantId}@resumedevelop作为业务网络标识符。 - 把
org.example.MyEvent替换成你在CTO文件中定义的实际事件类型。 - 用
async/await处理异步操作,同时做好异常捕获,避免程序崩溃。 - 事件订阅是长连接,需要保持进程运行,不要在订阅后立即退出程序。
内容的提问来源于stack exchange,提问作者a bc
相关产品推荐
相关产品推荐

