Hyperledger Fabric首个应用运行异常:Event Hub已关闭,invoke.js调用受阻
针对你在运行Hyperledger Fabric首个应用时遇到的两个问题,我整理了具体的排查和解决方案:
1. 解决「TypeError: Cannot read property 'getConnectivityState' of undefined」错误
这个错误本质是grpc版本与Fabric 1.1 Node SDK不兼容,你降级到grpc@1.9.1的方向是对的,但建议完整执行以下步骤确保彻底解决:
- 先卸载当前安装的grpc版本:
npm uninstall grpc - 清理项目的依赖缓存和锁定文件,避免残留问题:
rm -rf node_modules package-lock.json - 重新安装指定版本的grpc并保存到依赖:
npm install grpc@1.9.1 --save
做完这些后,重新运行之前卡住的步骤,应该能跳过这个类型错误。
2. 解决「Event Hub已在Fabric上关闭」的问题
这个问题通常和Event Hub的连接配置、peer节点状态或SDK事件监听逻辑有关,你可以从以下几个方向排查:
检查Peer节点的Event Hub端口配置
Fabric 1.1中,peer节点默认的事件端口:非TLS环境是7053,TLS环境是7051。你需要确认invoke.js中配置的端口和你的Fabric网络实际端口一致——可以查看项目中的docker-compose.yml文件,找到peer节点的ports映射项,比如"7051:7051"就说明TLS事件端口是7051。确认Peer节点处于正常运行状态
用docker ps命令查看peer容器的运行状态,如果容器已停止或异常,先重启对应的peer容器:docker-compose restart peer0.org1.example.com(替换成你实际的peer节点名称)
完善Event Hub的重连逻辑
默认的SDK代码可能没有处理Event Hub断开后的重连,你可以在invoke.js中添加监听逻辑,确保断开后自动重试:const eventHub = client.newEventHub(); // 根据你的网络配置选择非TLS或TLS地址 eventHub.setPeerAddr('grpc://localhost:7053'); // 如果是TLS环境,需要传入证书配置: // const tlsOpts = { pem: fs.readFileSync('./path/to/ca.crt').toString(), 'ssl-target-name-override': 'peer0.org1.example.com' }; // eventHub.setPeerAddr('grpcs://localhost:7051', tlsOpts); eventHub.connect(); // 监听断开事件并尝试重连 eventHub.on('disconnect', () => { console.log('Event Hub已断开,正在尝试重连...'); setTimeout(() => eventHub.connect(), 3000); });验证链码是否正确实例化
确保之前的链码安装(install)和实例化(instantiate)步骤完全成功,没有报错。你可以查看peer节点的日志,确认链码在正常运行:docker logs peer0.org1.example.com | grep chaincode如果日志中出现链码启动失败的信息,需要重新执行链码的安装和实例化步骤。
按照这些步骤逐一排查,应该能解决Event Hub关闭的问题,顺利完成node invoke.js的调用。
内容的提问来源于stack exchange,提问作者janDro

