如何在Node.js中启动两个进程并实现它们的管道通信?
在Node.js中实现子进程管道传输(等效于
curl "https://someurl.com" | jq .) 你可以用Node.js内置的child_process.spawn方法实现这个需求,它适合处理流式的子进程交互,核心思路是把第一个进程的标准输出(stdout)管道传输到第二个进程的标准输入(stdin),再把第二个进程的标准输出接到当前Node.js进程的标准输出上,这样就能自动适配终端显示或被管道到文件的场景。
完整代码示例
const { spawn } = require('child_process'); // 启动curl子进程,请求目标URL const curlProcess = spawn('curl', ['https://someurl.com']); // 启动jq子进程,格式化JSON输出 const jqProcess = spawn('jq', ['.']); // 建立管道:curl的输出传给jq的输入 curlProcess.stdout.pipe(jqProcess.stdin); // 将jq的输出接到当前进程的stdout,自动适配终端/文件输出 jqProcess.stdout.pipe(process.stdout); // 处理子进程的错误输出,直接打印到终端 curlProcess.stderr.pipe(process.stderr); jqProcess.stderr.pipe(process.stderr); // 监听子进程退出状态,方便排查错误 curlProcess.on('exit', (code) => { if (code !== 0) { console.error(`curl进程异常退出,退出码:${code}`); } }); jqProcess.on('exit', (code) => { if (code !== 0) { console.error(`jq进程异常退出,退出码:${code}`); } });
代码说明
spawn方法用于启动子进程,第一个参数是命令名,第二个参数是命令的参数数组(避免shell注入风险)- 通过
pipe方法实现进程间的数据流传输,和bash管道的逻辑完全一致 - 当前Node.js进程的
process.stdout会自动处理输出目标:如果用户直接运行程序,输出到终端;如果用户用node yourscript.js > output.json,输出会写入文件
内容的提问来源于stack exchange,提问作者Glynn Bird
相关产品推荐
相关产品推荐

