Quiero ejecutar un conjunto de scripts de prueba usando NodeJS, genera resultados de prueba mientras se ejecuta. Quiero que estos diferentes scripts de prueba se ejecuten sincrónicamente y también generen los resultados durante la ejecución.
Intenté usar la función spawnSync() del proceso secundario, sin embargo, no genera datos durante la ejecución del comando.
const { spawnSync } = require("child_process") const cmd = spawnSync('./gradlew',['test'],{cwd : '../../../'}) console.log(`Output: ${cmd.stdout}`)El código anterior genera los resultados solo cuando la tarea ha completado la ejecución por completo. Creo que este es el comportamiento esperado de spawnSync.
Por lo tanto, intenté ejecutar spawn () dentro de una función asíncrona con espera para sincronizarla, no estoy seguro de si este enfoque es correcto.
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() Al ejecutar el código anterior, el comando finaliza sin ningún resultado de la siguiente manera. Parece que el método cmd.stdout.on() no se ejecuta.
harrym@HarryM:~/Project/test$ node run-test.js Starting.. Running feature.... Running feature 1.... harrym@HarryM:~/Project/test$¿Hay algo de malo en esta forma de abordar?. Realmente necesito ayuda para depurar este problema. Además, cualquier sugerencia para sincronizar un proceso secundario mientras se genera un flujo de datos en vivo sería muy apreciada.
Gracias de antemano :)
Si usa el nodo 10 o superior, puede usar la función de iterador genérico como esa:
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); } })(); Uso for await en lsSpawn.stderr y lsSpawn.stdout
Sugerencia: si desea usar la promesa, no se mezcle con event.on , debe convertir event.on al formato de promesa.