Tengo un pequeño script que ejecuta un childprocess usando execFile . Este proceso secundario también es un script de nodo que ejecuta operaciones async , pero parece que las async nunca terminan, por lo que la terminal y todos los procesos están en espera.
Este es el script principal que ejecuta execFile para el proceso secundario:
fs.readdir(directoryPath, function(err, files) { if (err) console.log(`Error: ${err}`); files.map((file) => { execFile(`node`, ["updater.js", "BMW", file], (error, stdout, stderr) => { if (error) { red(`error: ${error.message}`); return; } if (stderr) { red(`stderr: ${stderr}`); return; } console.log(stdout); }); }); });Y este es el script de nodo ejecutado como proceso secundario:
const args = process.argv.slice(2); const brand = args[0]; const model = args[1]; const data = readJSON(`./json-export/${brand}/${model}`); const generations = data.generations; const generationsDB = await getGenerationsByModelAndBrand(brand, model); console.log(generationsDB); generations.map((generation) => { const lastModification = generation.modifications.modification[ generation.modifications.modification.length - 1 ]; console.log(lastModification); }); Todo el código funciona si comento la línea const generationsDB y el siguiente console.log . Si no, cuando la ejecución llega a la solicitud async , la ejecución se atasca allí. getGenerationsByModelAndBrand en el script principal y funciona sin problemas.
getGenerationsByModelAndBrand ejecuta una consulta en la base de datos y devuelve una Promise .
Este es el código del método getGenerationsByModelAndBrand :
export const getGenerationsByModelAndBrand = (brand, model) => { return new Promise((resolve, reject) => { const sql = `DATABASE SELECT`; connection.query(sql, function(error, result) { if (error) return reject(error); return resolve(result); }); }); }; La connection proviene del método mysql.createConnection del paquete mysql .
Creo que el problema proviene del manejo de la promesa en el proceso secundario, es como si me faltara algo pero no pude encontrar qué es.
Editar: después de investigar, no encontré una solución o explicación para este problema, por lo tanto, mientras tanto, moví getGenerationsByModelAndBrand al script principal y pasé el resultado como parámetro.