1

我从超级账本结构节点应用程序传递一个 json 对象并将其转换为缓冲区,如下所示:

const transientData = (transient && transient.length > 0) ? {data: Buffer.from(JSON.stringify(transient[0]))} : null;

然后将thistransientData传递给请求对象,如下所示:

        let request = {
            chaincodeId: smartContractName,
            fcn: funcName,
            args: args ? [JSON.stringify(args)] : [],
            chainId: channelName,
            txId: tx_id,
            collection-config: collections,
            transientMap: transientData
        };

问题是,当我尝试将此瞬态映射接收到链码中并尝试使用 将转换后的缓冲区记录为字符串transientData.get('data').toString()时,它显示以下输出:

ByteBufferNB(offset=1029,markedOffset=-1,limit=1222,capacity=1222)

但是,我期待字符串对象。我无法将此 ByteBuffer 转换为字符串。我还尝试打印此缓冲区,并显示以下输出:

ByteBuffer {
  buffer: <Buffer 0a c6 07 0a 91 01 08 03 10 01 1a 0c 08 df ef ca f8 05 10 80 bf df 80 01 22 0c 61 73 73 65 74 63 68 61 6e 6e 65 6c 2a 40 66 61 32 36 33 61 32 30 65 61 ... >,
  offset: 1029,
  markedOffset: -1,
  limit: 1222,
  littleEndian: true,
  noAssert: false }

任何建议,将不胜感激

更新:当我记录 的输出时transientData.get('data').buffer.toString(),它显示以下输出:

�
�
������߀"
        assetchannel*@fa263a20eaf15aac5eeac0ad2056a25193acc66f05c3316f1ee8d5062ac75de8:
                                                                                        assetccB �_찣ݹ��,R�Z���眕ӳ8v�pP�
�
+
)       assetcc��
submitTransactionReqLock�
data�{"sonefield":"T08700d-5c63-49a2-914f-535fd1abb045","collection":"xxxx","xxx":"xxx","xxxx":"xxx xx xxxx,"locked":false}
4

2 回答 2

2

这不应被标记为结构问题。这是纯 js 问题使用 toString('utf8') 而不是 toString() 您需要显式指定编码。见https://github.com/protobufjs/bytebuffer.js/wiki/API

于 2020-07-18T15:23:37.377 回答
0

在这里为任何正在寻找答案的人发布解决方案。

我设法通过将其转换ByteBufferArrayBuffer. 使用ArrayBuffer,我创建了一个新的缓冲区对象,然后使用它。

const data = JSON.parse(new Buffer(transient.get('data').toArrayBuffer()).toString());
于 2020-07-18T19:39:05.653 回答