child_process.stdout.on('data', cb) 将日志分组为一个事件

child_process.stdout.on('data', cb) groups logs into one event

这只是一个演示,不是我的真实代码。如果需要,我可以附上我的真实代码。

我有一个 scriptA,它通过以下方式输出日志:process.stdout.write.
然后我想从父 scriptB 获取每个日志:

const cp = child_process.spawn('node', ['scriptA.js']);
cp.stdout.on('data', (data) => {
   console.log(data.toString() + '\n');
});

应该输出:

line a 

line b

line c

但是它是把几行连成一行(如果短时间内输出):

line a
line b

line c

我尝试在 child_process 中使用超时,但当然它只会延迟它们。我也尝试过使用随机超时,但这也没有用,因为它只是弄乱了日志的顺序。

有人知道是否有任何方法可以解决这个问题吗?

编辑: 我只是想在父级中拆分日志,如果存在多个日志,则按行分派日志:

cp.stdout.on('data', (data) => {
  let logs = data.toString().split('\n').filter(x => x);
  logs.forEach(el => {
    console.log(`${el}\n\n`)
  });
});

这是我想要的,但我认为这不是最好的方法。 任何建议都有帮助!

您可以使用标准库中的 readline 模块来执行此操作。

const readline = require('readline');
const child_process = require('child_process');

const cp = child_process.spawn('node', ['scriptA.js']);
const reader = readline.createInterface({ input: cp.stdout })
reader.on('line', (line) => {
  console.log(line);
});

有一个选项 crlfDelay 您可能需要对其进行调整,该选项记录在 readline.createInterface()