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. 验证返回数据有效性
- 在链码返回前添加日志,输出要序列化的内容:
重启Peer节点后调用接口,查看日志中输出的let result = transactions || []; console.log("返回数据:", result); return shim.success(Buffer.from(JSON.stringify(result)));返回数据是否为有效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
相关产品推荐
相关产品推荐

