首页 > 解决方案 > 同步 spawn 和流事件输出 NodeJS

问题描述

我想使用 NodeJS 运行一组测试脚本,它在执行时输出测试结果。我希望这些不同的测试脚本同步运行,并在执行时输出结果。

我尝试使用子进程的 spawnSync() 函数,但是在命令执行期间它不输出数据。

const { spawnSync } = require("child_process")
const cmd = spawnSync('./gradlew',['test'],{cwd : '../../../'}) 
console.log(`Output: ${cmd.stdout}`)

上述代码仅在任务完全执行完成时才输出结果。我相信这是 spawnSync 的预期行为。

因此,我尝试在带有 await 的异步函数中运行 spawn() 来同步它,我不确定这种方法是否正确。

const { spawn } = require("child_process")

const cmd = spawn('./gradlew',['test'],{cwd : '../../../'})
const cmd1 = spawn('./gradlew',['test'],{cwd : '../../../'})

async function runFeature(){
   console.log("Running feature....")
   cmd.stdout.on('data', (data) => {
       console.log(`Output: ${data}`);
   });
}

async function runFeature1(){
   console.log("Running feature 1....")
   cmd1.stdout.on('data', (data) => {
       console.log(`Output1: ${data}`);
   });
}

async function main(){
   try{
       console.log("Starting...")
       await runFeature()
       await runFeature1()
       process.exit(0)
   } catch(e){
       console.error(e)
       process.exit(1)
   }
}

main()

运行上述代码时,命令结束,没有任何输出,如下所示。看起来该cmd.stdout.on()方法没有被执行。

harrym@HarryM:~/Project/test$ node run-test.js
Starting..
Running feature....
Running feature 1....
harrym@HarryM:~/Project/test$

这种方法有什么问题吗?我真的需要帮助来调试这个问题。此外,在输出实时数据流时同步子进程的任何建议都将受到高度赞赏。

先感谢您 :)

标签: javascriptnode.jschild-processspawn

解决方案


如果您使用节点 10 或更高版本,则可以使用如下通用迭代器函数:

const { spawn } = require('child_process');

(async () => {
  try {
    const lsSpawn = spawn('ls', ['-l'], { cwd: '../../../' });

    let error = '';
    for await (const chunk of lsSpawn.stderr) {
      error += chunk;
    }
    if (error) {
      console.error('error', error);
      return;
    }

    let data = '';
    for await (const chunk of lsSpawn.stdout) {
      data += chunk;
    }
    if (data) {
      console.log('data', data);
    }
  } catch (e) {
    console.error('execute error', e);
  }
})();

我用for awaitlsSpawn.stderrlsSpawn.stdout

提示:如果你想使用 promise don't mix-up with event.on,你应该转换event.on成 promise 格式


推荐阅读