节点:如何从child_process.spawn()流式传输STDERR内容?

时间:2018-07-26 18:25:09

标签: node.js child-process stderr stdio spawn

我正在使用Node的child_process.spawn()运行外壳命令,并带有以下代码:

const process = require('child_process').spawn('whoami');

// this works...
process.stdout.on('data', function(buf) {
    console.log('HERE IS SOME STDOUT CONTENT "%s"', String(buf));
});

// this never works...
process.stderr.on('data', function(buf) {
    console.log('HERE IS SOME STDERR CONTENT "%s"', String(buf));
});

// this works, but doesn't let me stream STDERR content...
process.on('error', (err) => {
    console.log('there was an error: ' + err);
});

运行上述有效命令whoami,让我读取传递给process.stdout.on的函数中的STDOUT数据。

如果我将命令更改为无效的东西(会产生一些STDERR内容),例如...

const process = require('child_process').spawn('whoami BADARGUMENTTOBREAKTHINGS');

... whoami命令向STDERR输出错误消息(在普通shell中),但是在Node中,process.stderr.on中的函数从未执行。我从没看到HERE IS SOME STDERR CONTENT消息。

我还尝试了其他一些无效的shell命令,例如cd folderthatdoesntexistls filenamethatdoesntexist,它们都应该产生STDERR内容。

1 个答案:

答案 0 :(得分:0)

输入问题后,我发现这很简单,因为您无法在.spawn()的第一个参数中使用空格...您必须将其余命令作为第二个参数带有数组,即

const process = require('child_process').spawn('whoami', ['BADARGUMENTTOBREAKTHINGS']);

这是意外的,因为.exec()和.spawnSync()都在第一个参数中使用空格。

希望这可以帮助将来遇到相同问题的其他人。