2016-01-20 19 views
9

Io uso il nodo child_process APINodo evento processo figlio ascolta

https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

var child = child_process.spawn(cmd, val, options); 

dal bambino Io uso il seguente

child.stdout.pipe(process.stdout); 
child.stderr.pipe(process.stderr); 

Posso aggiungere all'interno coloro evento tubo del codice all'interno come console.log?

come per esempio magari con prototipo

child.on('error', function(err) { 
     console.log(err); 
    }); 

aggiornamento

Che cosa ho bisogno che è quello di ascoltare questo childProcess.stderr.pipe(process.stderr); e nel caso ho ottenuto ed errore faccio process.exit(1)

quando provo qualcosa come ho ottenuto errore

child.stderr.pipe(function() { 
      console.log("im here"); 
      process.stderr; 
      process.exit(1); 
     } 
    ); 

UPDATE2

provo il seguente

var child = child_process.spawn(cmd, value, opt); 

child.stdout.on('data', function (data) { 
    console.log("IM HERE"); 
    console.log('data' + data); 
}); 
child.stderr.on('data', function (data) { 
    console.log("IM HERE"); 
    console.log('test: ' + data); 
    reject(data); 
}); 
child.on('close', function (code) { 
    console.log("IM HERE"); 
    console.log("close"); 
}); 
child.on('error', function (err) { 
    console.log("IM HERE"); 
    console.log(err); 
}); 
child.stderr.on('error', function (err) { 
    console.log("IM HERE"); 
    console.log("my Erorr"); 
    process.stderr.emit('error', err); 
}); 

child.stdout.on('data', function (buf) { 
    console.log("IM HERE"); 
    console.log('buf receive'); 
    console.log(buf.toString()); 
}); 

// Proprio quando aggiungo il seguente vedo l'errore nel registro

child.stderr.pipe(process.stderr) 

non della console .log ("im here") viene stampato in caso di errore

Ho bisogno in qualche modo di ascoltare questa pipe o forse di estendere in qualche modo il child.stderr.pipe (process.stderr), quello che mi serve è fare process.exit(1) nel caso in cui ho ricevuto errore dall'istruzione di codice sopra ...

Magari con javascript prototipo, ma non è sicuro come fare ...

prega assist Im bloccato e so che questo non è semplice ...

risposta

0

è possibile sottoscrivere l'evento (stdout o stderr data) e ascoltalo

child.stdout.on('data', function (buf) { 
    console.log(buf.toString()); 
}); 

Per esempio

const spawn = require('child_process').spawn; 
const child = spawn('ping', ['google.com']); 

child.stdout.on('data', function (buf) { 
    console.log('buf receive'); 

    console.log(buf.toString()); 
}); 
+0

Thansk ma ho bisogno del tubo e del process.stdout ... con esso ... –

+0

Grazie ma questo non funziona ... :( –

+0

puoi dire che non funziona esattamente? Ho aggiunto un esempio per rispondere a –

4

questo funziona per me: l'uscita

var child_process = require('child_process'); 
var cmd = 'ls'; 
var value = ['-z', '/usr']; 
var opt = { }; 

var child = child_process.spawn(cmd, value, opt); 

child.stdout.on('data', function (data) { 
    console.log("IM HERE"); 
    console.log('data' + data); 
}); 

child.stderr.on('data', function (data) { 
    console.log("IM HERE - Error"); 
    console.log('test: ' + data); 
}); 

child.on('close', function (code) { 
    console.log("IM HERE"); 
    console.log("close"); 
}); 

Console:

/* 
IM HERE - Error 
test: ls: invalid option -- 'z' 
Try 'ls --help' for more information. 

IM HERE 
close 
*/ 

Il problema nel vostro lato, forse il comando si sta generando doesn' t usare stderr?

Aggiornamento

Se aggiungo process.exit()

var child_process = require('child_process'); 
var cmd = 'ls'; 
var value = ['-z', '/usr']; 
var opt = { }; 

var child = child_process.spawn(cmd, value, opt); 

child.stdout.on('data', function (data) { 
    console.log("IM HERE"); 
    console.log('data' + data); 
}); 

child.stderr.on('data', function (data) { 
    console.log("IM HERE - Error"); 
    console.log('test: ' + data); 
    process.exit(1); // <<<< this works as expected and exit the process asap 
}); 

child.on('close', function (code) { 
    console.log("IM HERE"); 
    console.log("close"); 
}); 

L'output è leggermente diversa (senza vicino evento dal bambino)

/* 
IM HERE - Error 
test: ls: invalid option -- 'z' 
Try 'ls --help' for more information. 
*/ 

Si può "giocare" con il codice qui: https://tonicdev.com/shanshan/cp-spawn-piping

+0

Grazie, ma questo non funziona per me :(l'unica cosa che è stampare l'errore è child.stderr.pipe (process.stderr) il process.stderr, posso sapere quando viene ricevuto un errore, quindi esco (1) –

+0

@shopiaT 'child.stderr.on ('data')' consente di sapere quando si verifica un errore. Ho aggiunto process.exit (1) nel mio codice e l'output è leggermente diverso. – Shanoor