Estoy tratando de generar una nueva puntuación basada en el resultado de mi secuencia de comandos de python. La secuencia de comandos de Python devuelve los datos correctamente y el programa JS se imprime correctamente, pero el problema es que cuando devuelvo el valor y lo imprimo, se muestra indefinido
Código de función -
async function generateCanadaScore(creditscore = 0) { console.log(creditscore, "creditscore"); //prints 300 let MexicoData = 0; const python = spawn("python", [ "cp_production.py", "sample_dill.pkl", "mexico", Number(creditscore), ]); await python.stdout.on("data", function (data) { console.log("Pipe data from python script ..."); console.log(data.toString()); //prints number MexicoData = data.toString(); console.log(MexicoData) // prints number //working fine till here printing MexicoData Correctly (Output from py file) , problem in return return MexicoData ; }); python.stderr.on("data", (data) => { console.log(data); // this function doesn't run }); // return MexicoData ; already tried by adding return statement here still same error }Código de función de llamada -
app.listen(3005, async () => { console.log("server is started"); //function calling // Only for testing purpose in listen function let data = await generateCanadaScore(300); console.log(data, "data"); // undefined });No podré compartir el código Python, es confidencial.
No puede await en el controlador de eventos. (Devuelve undefined , por lo que básicamente estás haciendo await Promise.resolve(undefined) , que no espera nada).
Es posible que desee envolver la administración de su proceso secundario utilizando la new Promise() (que necesitará ya que child_process es una API asíncrona de devolución de llamada, y necesita API asíncronas de promesa):
const {spawn} = require("child_process"); function getChildProcessOutput(program, args = []) { return new Promise((resolve, reject) => { let buf = ""; const child = spawn(program, args); child.stdout.on("data", (data) => { buf += data; }); child.on("close", (code) => { if (code !== 0) { return reject(`${program} died with ${code}`); } resolve(buf); }); }); } async function generateCanadaScore(creditscore = 0) { const output = await getChildProcessOutput("python", [ "cp_production.py", "sample_dill.pkl", "mexico", Number(creditscore), ]); return output; }