Capture the stdout of a process in a variable

1

I have the following question as I capture the stdout to use it later (when I match it to data it prints it empty);

var exec = require('child_process').exec;
var data = "5";
var child = exec('java -jar DproRan.jar',
  function (error, stdout, stderr){
    console.log('Output -> ' + stdout);
    data = stdout;
    if(error !== null){
      console.log("Error -> "+error);
    }
  }
);

console.log(data);

function imprimir(stdout) {
  if(stdout!=null) {
    var ss = stdout.split("_");
    console.log(ss[1],ss[3],ss[5]);

  } else {
    console.log("error");
  }
}
    
asked by Brayan Espinoza 31.01.2018 в 20:41
source

1 answer

1

Good @Brayan,

You are accessing the variable "data" before it is loaded. To make correct use of NodeJS you should bear in mind that calls are made asynchronously unless otherwise forced.

First I'll tell you in your code why nothing was shown when doing "console.log (data);":

var exec = require('child_process').exec;
var data = "5";
var child = exec('java -jar DproRan.jar',
// Esta funcion anónima es la que recibe el resultado de ejecutar el comando, y aquí es donde verás stdout por primera vez. 
function (error, stdout, stderr){ 
  console.log('Output -> ' + stdout);
  data = stdout;
  if(error !== null){
    console.log("Error -> "+error);
  }
});
// Data se initializa a 5, y se sobreescribe con stdout una vez que el método "exec" termine y se ejecute la función anónima que se ha definido como retorno.
// Se va a ejecutar esto antes de que se le asigne el valor de stdout.
console.log(data);


// Este método no se llama en tu código.
function imprimir(stdout)
{
  if(stdout!=null)
  {
      var ss = stdout.split("_");
      console.log(ss[1],ss[3],ss[5]);

  }
  else
  {
      console.log("error");
  }
}

To avoid this happening to you, which is a very common mistake when you start with Node JS you have to understand how it works, and make correct use of it. The most appropriate thing would be something like this:

var exec = require('child_process').exec;
var data = "5";
var child = exec('java -jar DproRan.jar',
// Esta funcion anónima es la que recibe el resultado de ejecutar el comando, y aquí es donde verás stdout por primera vez. 
function (error, stdout, stderr){ 
  if(error !== null || stderr !== null){
    console.log("Error -> " + error);
    console.log("StdError -> " + stderr);
  }else{
    console.log('Output -> ' + stdout);
    data = stdout;
    // Si quieres comprobar la variable data una vez que se ha cargado con la respuesta de stdout tienes que hacerlo de aquí en adelante.
    // Por ejemplo lo vamos a comprobar al finalizar la función a la que se va a llamar ahora.
    imprimir();
  }
});
// Verás que se suprime el comando console.log(data), ya que desde aquí no estaría nunca accesible esa variable cargada con stdout.


// Este método ahora sí se llama desde la función anónima que tiene el método "exec" a modo de callback.
// Verás que ya no se pasa variable por parámetro y hace uso de data.
function imprimir(){
  if(data!=null){
      var ss = data.split("_");
      console.log(ss[1],ss[3],ss[5]);

  }else{
      console.log("Error: Variable data es null.");
  }
  
  // Aunque la variable data se ha usado a lo largo de este método, voy a añadir el comando "console.log(data);" para que lo veas más claramente.
  console.log(data);
}
    
answered by 02.02.2018 в 10:36