修改FabCar链码后执行invoke报错:ReferenceError: from未定义
问题分析与解决办法
核心问题根源
你遇到的"No valid responses from any peers"是链码执行报错导致的连锁反应,节点日志里的ReferenceError: from is not defined已经明确指出:在fabcar.js的writeJsonData方法中,你使用了未声明的from变量,直接造成链码执行失败,peer无法返回有效响应。
具体解决步骤
1. 修复链码中的变量未定义问题
打开fabcar.js找到writeJsonData方法,检查代码中所有用到from的位置:
- 错误示例(未声明
from):async writeJsonData(ctx, data) { let jsonData = { sender: from, // 此处from未定义 content: data }; await ctx.stub.putState('jsonKey', Buffer.from(JSON.stringify(jsonData))); } - 修正方式(根据业务需求补充
from的定义):
如果from是指调用链码的用户身份,可以通过Fabric的身份API获取:
如果async writeJsonData(ctx, data) { // 声明并赋值from变量,获取调用者的身份ID const from = ctx.clientIdentity.getID(); let jsonData = { sender: from, content: data }; await ctx.stub.putState('jsonKey', Buffer.from(JSON.stringify(jsonData))); }from是业务参数,需要在方法入参中添加并传递:async writeJsonData(ctx, from, data) { let jsonData = { sender: from, content: data }; await ctx.stub.putState('jsonKey', Buffer.from(JSON.stringify(jsonData))); }
2. 重新部署链码
链码修改后必须重新打包、安装并升级,否则peer会继续运行旧版本的链码:
- 打包链码:
peer chaincode package fabcar.tar.gz --path ./chaincode/fabcar/javascript --lang node --label fabcar_1 - 安装到peer节点:
peer chaincode install fabcar.tar.gz - 升级链码(注意替换通道ID、版本号等参数为你的实际配置):
peer chaincode upgrade -o orderer.example.com:7050 --channelID mychannel --name fabcar --version 1.1 --sequence 2 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt -c '{"Args":["init"]}'
3. 验证调用结果
链码升级完成后,重新运行invoke.js:
node invoke.js
如果链码修复正确,应该能正常完成调用,不再返回No valid responses from any peers错误。
额外排查点
- 检查容器状态:用
docker ps确认peer、orderer、链码容器都处于Up状态,没有异常退出 - 查看链码容器日志:如果问题依旧,用
docker logs <链码容器ID>获取更详细的执行报错信息,进一步定位问题
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

