NodeJS - 如何在使用 JSON.parse(JSON.stringify()) 后从缓冲区检索原始数据

NodeJS - How to retrieve original data from a Buffer after use JSON.parse(JSON.stringify())

我正在使用 crypto 库发送一个 POST 请求来更新一些数据,出于某种原因,我感觉好像我使用了 JSON.parse(JSON.stringify(myBufferData))Buffer数据。我想恢复原始数据

如何复制我的情况:

var buf = Buffer.from('abc');
var parsedBuf = JSON.parse(JSON.stringify(buf)); -> I faced with this result at some point.

buf.toString() -> Give the expected result ('abc').
parsedBuf.toString() -> Doesn't retrieve original data ('[object Object]').

如何从 parsedBuf 中检索原始数据?

解决方案

使用 Buffer(parsedBuf).toString() 而不是 parsedBuf.toString() 来检索原始数据。


说明

查看Buffer docs,我发现它的toString方法不是Javascript的内置方法。您可以通过调用 buf.[method].toString() 在任何您想要的地方简单地检查它的来源。在这种情况下:

  • buf.toString.toString()

  • JSON.parse(JSON.stringify(buf)).toString.toString()

所以它以某种方式向我展示了他们的源代码:

// Buffer's toString method
function () {
  let result;
  if (arguments.length === 0) {
    result = this.utf8Slice(0, this.length);
  } else {
    result = slowToString.apply(this, arguments);
  }
  if (result === undefined)
    throw new Error('"toString()" failed');
  return result;
}

// Javascript's built-in
function toString() { [native code] } // I haven't sought to find it out

事实证明,每当您执行 JSON.parse(JSON.stringify(buf)) 时,您实际上是在将 Buffer 转换为 Javascript 对象。例如:

{ type: 'Buffer', data: [ 61, 62, 63] }.

所以它上面的另一个 toString() 将 运行 native JS 函数(不是 Buffer 的)默认 returns [object Object] .