You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:16:12