Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.1K
Views
¿Cómo prometer las funciones child_process.exec y child_process.execFile de Node con Bluebird?

Estoy usando la biblioteca de promesas de Bluebird en Node.js, ¡es genial! Pero tengo una pregunta:

Si observa la documentación de child_process.exec y child_process.execFile de Node, puede ver que ambas funciones devuelven un objeto ChildProcess.

Entonces, ¿cuál es la forma recomendada de prometer tales funciones?

Tenga en cuenta que lo siguiente funciona (obtengo un objeto Promesa):

 var Promise = require('bluebird'); var execAsync = Promise.promisify(require('child_process').exec); var execFileAsync = Promise.promisify(require('child_process').execFile);

Pero, ¿cómo se puede acceder al valor de retorno original de las funciones originales de Node.js? (En estos casos, necesitaría poder acceder a los objetos ChildProcess devueltos originalmente).

¡Cualquier sugerencia sería apreciada!

EDITAR:

Aquí hay un código de ejemplo que usa el valor de retorno de la función child_process.exec:

 var exec = require('child_process').exec; var child = exec('node ./commands/server.js'); child.stdout.on('data', function(data) { console.log('stdout: ' + data); }); child.stderr.on('data', function(data) { console.log('stderr: ' + data); }); child.on('close', function(code) { console.log('closing code: ' + code); });

Pero si usara la versión prometida de la función exec ( execAsync de arriba ), entonces el valor de retorno será una promesa, no un objeto ChildProcess. Este es el verdadero problema del que estoy hablando.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Recomendaría usar promesas JS estándar integradas en el lenguaje sobre una dependencia de biblioteca adicional como Bluebird.

Si usa Node 10+, los documentos de Node.js recomiendan usar util.promisify que devuelve un objeto Promise<{ stdout, stderr }> . Vea un ejemplo a continuación:

 const util = require('util'); const exec = util.promisify(require('child_process').exec); async function lsExample() { try { const { stdout, stderr } = await exec('ls'); console.log('stdout:', stdout); console.log('stderr:', stderr); } catch (e) { console.error(e); // should contain code (exit code) and signal (that caused the termination). } } lsExample()

Maneje los errores primero desde stderr .

over 4 years ago · Santiago Trujillo Report

0

Parece que te gustaría devolver dos cosas de la llamada:

  • el proceso infantil
  • una promesa que se resuelve cuando el ChildProcess se completa

Entonces, ¿"la forma recomendada de prometer tales funciones"? no

Estás fuera de la convención. Se espera que las funciones de devolución de promesa devuelvan una promesa, y eso es todo. Podría devolver un objeto con dos miembros (el ChildProcess y la promesa), pero eso solo confundirá a las personas.

Sugeriría llamar a la función no prometida y crear una promesa basada en el childProcess devuelto. (Tal vez envuelva eso en una función de ayuda)

De esta forma, es bastante explícito para la próxima persona que lea el código.

Algo como:

 var Promise = require('bluebird'); var exec = require('child_process').execFile; function promiseFromChildProcess(child) { return new Promise(function (resolve, reject) { child.addListener("error", reject); child.addListener("exit", resolve); }); } var child = exec('ls'); promiseFromChildProcess(child).then(function (result) { console.log('promise complete: ' + result); }, function (err) { console.log('promise rejected: ' + err); }); child.stdout.on('data', function (data) { console.log('stdout: ' + data); }); child.stderr.on('data', function (data) { console.log('stderr: ' + data); }); child.on('close', function (code) { console.log('closing code: ' + code); });

Si solo desea prometer específicamente child_process.exec() y child_process.execFile() , en las versiones recientes del nodo hay una mejor respuesta here .

over 4 years ago · Santiago Trujillo Report

0

Desde Node v12, el util.promisify permite el acceso al objeto ChildProcess en la Promise devuelta para las funciones integradas donde habría sido devuelto por la llamada no prometida. De los documentos :

La instancia de ChildProcess devuelta se adjunta a Promise como una propiedad child .

Esto satisface correcta y simplemente la necesidad de acceder a ChildProcess en la pregunta original y hace que otras respuestas estén desactualizadas siempre que se pueda usar Node v12+.

Adaptando el ejemplo (y el estilo conciso ) proporcionado por el interrogador, el acceso al ChildProcess se puede lograr como:

 const util = require('util'); const exec = util.promisify(require('child_process').exec); const promise = exec('node ./commands/server.js'); const child = promise.child; child.stdout.on('data', function(data) { console.log('stdout: ' + data); }); child.stderr.on('data', function(data) { console.log('stderr: ' + data); }); child.on('close', function(code) { console.log('closing code: ' + code); }); // ie can then await for promisified exec call to complete const { stdout, stderr } = await promise;
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!