如何使用Node.js spawn调用带参数的Node脚本并获取实时输出?
解决Node.js spawn传参问题,同时保留实时输出
我太懂这种纠结了——想用spawn保住实时输出的优势,但传参怎么都不对,换成exec又丢了实时日志,简直两难!你的问题其实出在spawn的参数数组格式上,咱们来快速搞定它:
你的写法哪里错了?
你当前的代码把所有参数塞进了一个字符串里:
var build = spawn('node',['src/server/single.js build=complete incrementVersion=true uploadBuild=true')
这就相当于在命令行里敲了:
node "src/server/single.js build=complete incrementVersion=true uploadBuild=true"
Node会把整个长字符串当成要执行的脚本文件名,而不是把后面的内容当成参数传给single.js,自然没法正确传参。
正确的spawn传参姿势
spawn的第二个参数是独立参数组成的数组,每个命令行参数都得单独占一个数组元素,包括你的脚本路径本身:
var build = spawn('node', [ 'src/server/single.js', 'build=complete', 'incrementVersion=true', 'uploadBuild=true' ]);
这样写就完全等价于你在命令行手动执行:
node src/server/single.js build=complete incrementVersion=true uploadBuild=true
参数就能正确传递给你的脚本了。
怎么保持实时输出?
这正是spawn的优势所在——它返回的子进程对象是流,你只需要监听stdout和stderr的data事件,就能实时拿到输出:
// 实时捕获标准输出 build.stdout.on('data', (data) => { console.log(`${data}`); }); // 实时捕获错误输出 build.stderr.on('data', (data) => { console.error(`${data}`); });
完美兼顾传参正确性和实时输出需求。
额外提一句(你大概率已经知道,但以防万一)
在你的single.js里,还是通过process.argv来拿这些参数就行,比如process.argv[2]对应build=complete,process.argv[3]对应incrementVersion=true,以此类推。
内容的提问来源于stack exchange,提问作者Piero
相关产品推荐
相关产品推荐

