child_process.spawn 返回缓冲区对象

child_process.spawn returning buffer object

const cp = require("child_process");

ls = cp.spawn("node", ["./scripts/test.js"]);

ls.stdout.on("data", (data) => {
    console.log(`stdout": ${data}`);

    const result = data.toString();

  });

ls.stdout.on 中,我正在获取数据作为缓冲区,如果我这样做 data.toString() 它给了我像 "{evenNumberSum :8, oddNumberSum:6}" 这样的结果,但我想把结果作为一个 JSON 对象,我什至无法解析这种类型的结果谁能给我一个更好的方法来从 buffer

中获取结果
CurrentOutput:
<Buffer 7b 3a 6e 61 6d 65 3d 3e 22 4a 6f 68 6e 22 2c 20 3a 61 67 65 3d 3e 33 30 2c 20 3a 63 69 74 79 3d 3e 22 4e 65 77 20 59 6f 72 6b 22 7d 0a>


Required Output:
{evenNumberSum :8, oddNumberSum:6}

test.js

let result = {};
function add(val1, val2) {
  return val1 + val2;
}
result.evenNumbersSum = add(2, 4);
result.oddNumbersSum = add(1, 3);
result.mixNumbersSum = add(1, 2);
console.log(result);

我不确定 test.js 是什么样子,但我无法重现这个问题。

我正在使用以下代码..


--EDIT/DISCLAIMER-- 人们很可能对此表示反对,因为我提供的解决方案使用 eval.总结:

  • 您应该尽可能少地使用 eval(在完美的世界中,永远不会使用 eval
  • 仅在 *TRUSTED* 字符串上使用(也不要在用户提供的数据上使用 eval!!!曾经。)

考虑到上面的免责声明,我能让它起作用的唯一方法是:

main.js:

const cp = require('child_process');

ls = cp.spawn('node', ['./test.js']);

ls.stdout.on('data', (data) => {
  const dataString = data.toString();
  const dataJson = eval(`(${dataString})`);

  console.log('Data as JSON  =', dataJson);
  console.log('evenNumberSum =', dataJson.evenNumberSum);
  console.log('oddNumberSum  =', dataJson.oddNumberSum);
});

test.js:

console.log({ evenNumberSum: 8, oddNumberSum: 6 }); 

产生以下输出:

Data as JSON  = { evenNumberSum: 8, oddNumberSum: 6 }
evenNumberSum = 8
oddNumberSum  = 6