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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:22:12