Node.js写入子进程

时间:2017-12-05 10:54:39

标签: javascript node.js child-process

我尝试使用child_process模块和覆盆子pi上的mpg123播放器在node.js中创建一个mp3 webradio。

问题在于: 当我尝试写入流时,我总是得到一个错误:

Error: write EPIPE
at exports._errnoException (util.js:1026:11)
at WriteWrap.afterWrite (net.js:795:14)

这是我试图测试的内容:

//create a subprocess
var test = childProcess.exec('ls /home/pi/music');

//pipe all the output to the process output
test.stdout.pipe(process.stdout);
test.stderr.pipe(process.stderr);

test.stdin.setEncoding('utf-8');

//here I just want to write a key to the subprocess
test.stdin.write('q');
test.stdin.end()

任何人都知道,该做什么,在完成所有工作之前,创建的写入流不会被关闭?

当然,我仍然在谷歌搜索:

Child_process throw an Error: write EPIPE

https://github.com/nodejs/node/issues/2985

https://nodejs.org/api/child_process.html#child_process_subprocess_stdin

https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback

请帮忙!

1 个答案:

答案 0 :(得分:0)

EPIPE写入错误意味着有人正在写入一个人们无法读取的管道。

此外,因为在没有人处理它的情况下引发此错误,所以错误对于您的进程来说是致命的。遗憾的是,node并没有很好地识别哪个流,但是我们可以在你的代码中猜测它,而且这个代码只写了一个流......

如果添加错误处理程序,则可以验证错误是来自“stdin”流: test.stdin.on('error', (...args) => { console.log('stdin err', args); });

现在错误将被“处理”(糟糕),并且该过程将继续,因此您至少知道它的来源。

具体而言,此test.stdin.write('q')正在为您的流程的标准输入写q。但您的子进程为ls。它在stdin上不接受任何东西,所以它关闭stdin。因此,当父尝试写入现在关闭的管道时,OS会发回EPIPE错误。所以,停止这样做。

您可能希望ls的行为与您以交互方式键入ls时的行为相同,但可能不会(我怀疑您的互动ls正在通过寻呼机,而您'期望你需要退出该寻呼机?)这个子进程更像是以交互方式运行/bin/ls