【发布时间】:2020-11-12 01:04:42
【问题描述】:
我正在尝试为具有所有相关值的特定分类帐条目(或条目范围)生成格式良好的视图。
当我运行链码查询时,我得到如下输出:
user@server:~/fabric-samples/test-network$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C mychannel -n myFirstChaincode --peerAddresses localhost:7051 --tlsRootCertFiles $PEER1_TLS -c '{"function":"queryOrder","Args":["004"]}'
2020-11-08 16:01:05.166 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 payload:"{\"actualDimensions\":{\"DIM1\":{},\"DIM2\":{},\"DIM3\":{},\"DIM4\":{}},\"customer\":\"GM\",\"dueDate\":\"tomorrow\",\"manufacturer\":\"undefined\",\"manufacturingData\":{},\"numOfDims\":\"5\",\"orderStatus\":\"new\",\"partID\":\"004\",\"partName\":\"Test Part\",\"requiredDimensions\":{\"DIM1\":{},\"DIM2\":{},\"DIM3\":{},\"DIM4\":{}}}"
此输出看起来像一个长 JSON 字符串,其中换行符替换为 \。
我正在寻找人类可读的输出。虽然我可以阅读上面的条目,但相关的数据结构非常简单。如果我用多个嵌套对象查询另一个条目,它很快就会变得过于混乱而难以阅读。
我尝试将JSON.stringify(value,null,4) 之类的内容添加到链码查询函数中,但这无济于事:
2020-11-07 23:40:41.964 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 payload:"{\n \"actualDimensions\": {\n \"DIM1\": {},\n \"DIM2\": {},\n \"DIM3\": {},\n \"DIM4\": {}\n },\n \"customer\": \"GM\",\n \"dueDate\": \"tomorrow\",\n \"manufacturer\": \"undefined\",\n \"manufacturingData\": {},\n \"numOfDims\": \"5\",\n \"orderStatus\": \"new\",\n \"partID\": \"004\",\n \"partName\": \"Test Part\",\n \"requiredDimensions\": {\n \"DIM1\": {},\n \"DIM2\": {},\n \"DIM3\": {},\n \"DIM4\": {}\n }\n}"
似乎peer命令可能在JSON.stringify之后格式化输出...
This page 建议您可以使用环境变量修改用于 peer 命令的日志记录格式,尽管除了该网页之外,我没有找到任何示例或详细信息。
当我尝试向我的 cli 添加环境变量时:
export FABRIC_LOGGING_FORMAT=json,并没有太大帮助(它添加了更多的 '/' 而不是换行符):
student@hlfmc:~/fabric-samples/test-network$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles $PEER1_TLS --peerAddresses localhost:9051 --tlsRootCertFiles $PEER2_TLS -c '{"function":"GetAllAssets","Args":[]}'
{"level":"info","ts":1605042675.2069416,"name":"chaincodeCmd","caller":"chaincode/common.go:160","msg":"Chaincode invoke successful. result: status:200 payload:\"[{\\\"Key\\\":\\\"asset1\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset1\\\",\\\"Color\\\":\\\"blue\\\",\\\"Size\\\":5,\\\"Owner\\\":\\\"Tomoko\\\",\\\"AppraisedValue\\\":300,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset2\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset2\\\",\\\"Color\\\":\\\"red\\\",\\\"Size\\\":5,\\\"Owner\\\":\\\"Brad\\\",\\\"AppraisedValue\\\":400,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset3\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset3\\\",\\\"Color\\\":\\\"green\\\",\\\"Size\\\":10,\\\"Owner\\\":\\\"Jin Soo\\\",\\\"AppraisedValue\\\":500,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset4\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset4\\\",\\\"Color\\\":\\\"yellow\\\",\\\"Size\\\":10,\\\"Owner\\\":\\\"Max\\\",\\\"AppraisedValue\\\":600,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset5\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset5\\\",\\\"Color\\\":\\\"black\\\",\\\"Size\\\":15,\\\"Owner\\\":\\\"Adriana\\\",\\\"AppraisedValue\\\":700,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset6\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset6\\\",\\\"Color\\\":\\\"white\\\",\\\"Size\\\":15,\\\"Owner\\\":\\\"Michel\\\",\\\"AppraisedValue\\\":800,\\\"docType\\\":\\\"asset\\\"}}]\" "}
(上面的测试是在单独的服务器上运行的,使用 stock "asset-transfer-basic" 示例链代码。) 注意:我还尝试使用“格式:json”更新 fabric-samples/config/core.yaml 文件,然后重新运行链代码(在正确关闭所有内容并重新启动网络之后)。这给出了与以前相同的输出(与原始输出没有变化)。我还尝试在 /etc/hyperledger/fabric/core.yaml 编辑对等 docker 容器的内部 core.yaml 文件,这似乎也没有影响输出。
我还尝试过从应用程序调用链代码(而不是直接从 CLI 调用)。结果输出字符串不再有'/'(但仍然没有换行符/缩进):
user@server$ node query2.js
Wallet path: /home/user/Project/application/wallet
Transaction has been evaluated, result is: {"actualDimensions":{"DIM1":{},"DIM2":{},"DIM3":{},"DIM4":{}},"customer":"GM","dueDate":"tomorrow","manufacturer":"undefined","manufacturingData":{},"numOfDims":"5","orderStatus":"new","partID":"004","partName":"Test Part","requiredDimensions":{"DIM1":{},"DIM2":{},"DIM3":{},"DIM4":{}}}
如果我尝试在输出字符串上使用 JSON.stringify,我会再次得到“/”:
user@server$ node query2.js
Wallet path: /home/user/Project/application/wallet
Transaction has been evaluated, result is: "{\"actualDimensions\":{\"DIM1\":{},\"DIM2\":{},\"DIM3\":{},\"DIM4\":{}},\"customer\":\"GM\",\"dueDate\":\"tomorrow\",\"manufacturer\":\"undefined\",\"manufacturingData\":{},\"numOfDims\":\"5\",\"orderStatus\":\"new\",\"partID\":\"004\",\"partName\":\"Test Part\",\"requiredDimensions\":{\"DIM1\":{},\"DIM2\":{},\"DIM3\":{},\"DIM4\":{}}}"
这是应用程序代码:(第 48 行是原始版本;46-47 是第二个版本)
45 ¦ ¦ ¦ const result = await contract.evaluateTransaction('queryOrder','004');
46 ¦ ¦ ¦ const stringResult=result.toString();
47 ¦ ¦ ¦ console.log(`Transaction has been evaluated, result is: ${JSON.stringify(stringResult,null,4)}`);
48 ¦ ¦ ¦ //console.log(`Transaction has been evaluated, result is: ${result.toString()}`);
我看到这个post 有一个类似的问题,但它没有为漂亮的格式提供任何解决方案。
目前有什么解决方案/建议吗?
我会对 JSON 格式或其他任何具有间距/换行符并使当前输出更易于阅读的内容感到满意。
【问题讨论】:
标签: hyperledger-fabric hyperledger-chaincode