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

Hyperledger Fabric 2.2查询交易时JSON输入意外结束错误求助

解决Hyperledger Fabric 2.2积分奖励示例交易查询JSON解析错误

可能原因及排查修复步骤

1. 链码返回数据无效或为空

JSON.parse抛出该错误的核心原因是输入为空字符串或非JSON格式内容。检查EarnPointsTransactionsInfo和UsePointsTransactionsInfo链码函数的返回逻辑:

  • 若函数在无交易记录时返回空Buffer(比如return shim.success(Buffer.from(''))),会直接触发解析失败。正确做法是返回空JSON数组:return shim.success(Buffer.from(JSON.stringify([])))。
  • 若返回非JSON结构(如纯字符串、未序列化的对象),也会导致解析错误,确保所有返回内容都经过JSON.stringify处理后再转为Buffer。

2. 链码查询逻辑未处理空数据场景

查看customerloyalty.js中对应查询函数的代码,检查是否未处理账本查询结果为空的情况:
错误示例:

let data = stub.getState(userTransactionKey);
let transactions = JSON.parse(data.toString()); // 若data为空,toString()返回空字符串,parse失败

修复方式:先判断数据是否存在,不存在则返回空数组:

let data = await stub.getState(userTransactionKey);
if (!data || data.length === 0) {
    return shim.success(Buffer.from(JSON.stringify([])));
}
let transactions = JSON.parse(data.toString());
// 后续处理逻辑

3. 应用侧调用参数错误

确认应用调用接口时传入的参数(如用户ID)是否合法:

  • 若传入不存在的用户ID,链码查询不到数据会返回空值,进而引发解析错误。可在应用侧调用前打印参数,同时在链码中添加日志(console.log)查看参数是否正确传递。

4. 链码版本未更新

若修改链码后未重新打包、安装、升级,运行的仍是旧版本代码,可能依然存在返回无效数据的问题。通过以下命令验证链码版本:

# 查看已安装链码
peer chaincode list --installed
# 查看已实例化链码
peer chaincode list --instantiated

若版本不符,重新执行链码打包、安装、升级操作。

5. 验证返回数据有效性

  • 在链码返回前添加日志,输出要序列化的内容:
    let result = transactions || [];
    console.log("返回数据:", result);
    return shim.success(Buffer.from(JSON.stringify(result)));
    
    重启Peer节点后调用接口,查看日志中输出的返回数据是否为有效JSON。
  • 应用侧捕获错误并打印原始响应:
    try {
        const response = await contract.evaluateTransaction('EarnPointsTransactionsInfo', userId);
        console.log("原始响应:", response.toString());
        const data = JSON.parse(response.toString());
    } catch (err) {
        console.error("错误响应:", err.message);
    }
    

内容的提问来源于stack exchange,提问作者Ninjo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:20:30