Hyperledger Fabric测试网络调用addNewPatients函数无响应求助
问题排查与修复方案
1. 核心代码错误:getStateByPartialCompositeKey使用不当
你当前代码里直接将该方法的返回值当成结果数组处理,但它实际返回的是状态迭代器(StateQueryIterator),没有length属性,且若不手动关闭迭代器,会导致链码调用一直处于挂起状态(也就是你看到的光标闪烁无响应)。同时错误处理逻辑吞掉异常,无法定位问题。
修复后的完整代码
async addNewPatients(ctx, patientName, aadhaar, age, gender, mobileNo, address){ let patientExists = false; // 获取部分复合键对应的迭代器 const patientIterator = await ctx.stub.getStateByPartialCompositeKey('hospitalName.patient', [aadhaar]); try { let result = await patientIterator.next(); // 遍历迭代器,判断是否存在该患者 while (!result.done) { patientExists = true; break; } } finally { // 必须关闭迭代器,否则链码调用会卡住 await patientIterator.close(); } if(!patientExists){ const patientCounter = await ctx.stub.getState('patientCounter'); let thisPatientID = 'INPK'; if (!patientCounter || patientCounter.length === 0) { thisPatientID += '000000001'; } else { const counter = parseInt(patientCounter.toString()); thisPatientID += (counter + 1).toString().padStart(9, "0"); } const patientKey = ctx.stub.createCompositeKey('hospitalName.patient', [thisPatientID, aadhaar]); const patientDetails = { patientID: thisPatientID, Name: patientName, Aadhaar: aadhaar, Age: age, Gender: gender, contactInfo: mobileNo, Address : address, }; await ctx.stub.putState(patientKey, Buffer.from(JSON.stringify(patientDetails))); await ctx.stub.putState('patientCounter', Buffer.from(thisPatientID.substring(4))); return patientDetails; } else { throw new Error(`This patient with aadhaar ${aadhaar} already exists`); } }
2. 调用命令校验
确保链码调用命令的参数数量、格式完全匹配函数定义,示例命令如下:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"addNewPatients","Args":["张三","123456789012","30","男","13800138000","北京市海淀区"]}'
- 检查
Args数组的元素数量是否为6个,与函数参数一一对应 - 确认通道名、链码名、节点地址配置正确
3. 日志排查
查看Peer节点的链码日志,获取具体执行错误:
# 查看org1的peer0节点日志 docker logs -f peer0.org1.example.com
日志中会显示链码执行时的异常细节,比如参数解析错误、迭代器未关闭等问题。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

