Hyperledger Fabric链码shim.Error()返回JSON解析问题咨询
解决Hyperledger Fabric链码错误解析的问题
我来帮你搞定这个问题!你遇到的情况是Hyperledger Fabric的shim.Error()会把错误消息包装成固定格式的字符串,导致Node.js SDK拿到的是拼接后的文本,没法直接提取status和message。下面给你两种解决方案:
方案一:解析现有错误字符串
既然SDK返回的错误消息格式是固定的"chaincode error (status: 500, message: xxx)",我们可以用正则表达式来提取里面的状态码和错误信息。
在Node.js里可以这么写:
const chaincodeError = "chaincode error (status: 500, message: The email or password you have entered is wrong.)"; // 匹配固定格式的正则表达式 const errorRegex = /chaincode error \(status: (\d+), message: (.+)\)/; const matchResult = chaincodeError.match(errorRegex); if (matchResult) { const errorStatus = parseInt(matchResult[1]); const errorMessage = matchResult[2].trim(); console.log(`提取到错误状态:${errorStatus}`); console.log(`提取到错误信息:${errorMessage}`); } else { console.log("无法解析错误格式"); }
方案二:用shim.Success()返回自定义错误JSON(更推荐)
其实没必要纠结shim.Error(),我们可以换个思路:用shim.Success()返回一个包含错误状态和消息的JSON结构体,这样SDK就能直接解析成JSON对象,不用做字符串匹配。
链码端(Go语言)代码示例:
import ( "encoding/json" "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" ) // 定义一个统一的响应结构体,兼容成功和错误场景 type ChaincodeResponse struct { Status int `json:"status"` Message string `json:"message"` Data interface{} `json:"data,omitempty"` // 可选字段,用于返回正常业务数据 } // 在需要返回错误的逻辑中使用 func (s *YourChaincode) AuthFunction(stub shim.ChaincodeStubInterface, args []string) peer.Response { // 模拟邮箱密码验证失败的场景 errResp := ChaincodeResponse{ Status: 500, Message: "The email or password you have entered is wrong.", } respBytes, err := json.Marshal(errResp) if err != nil { return shim.Error("Failed to serialize error response") } return shim.Success(respBytes) }
Node.js SDK端代码示例:
// 假设调用链码后拿到的response对象 const responsePayload = JSON.parse(response.payload.toString()); if (responsePayload.status !== 200) { // 约定200为成功状态码,其他值代表错误 console.log(`错误状态码:${responsePayload.status}`); console.log(`错误信息:${responsePayload.message}`); // 这里处理错误逻辑 } else { // 处理正常返回的业务数据 console.log("正常响应数据:", responsePayload.data); }
为什么shim.Error()不能返回JSON?
因为shim.Error()的设计是直接接收一个字符串作为错误消息,Fabric Peer节点会自动把这个消息包装成"chaincode error (status: 500, message: xxx)"格式的字符串返回给SDK,所以没法直接传入JSON字节数组并保留结构。
内容的提问来源于stack exchange,提问作者Debut Infotech
相关产品推荐
相关产品推荐

