Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1.1K
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda