2016-01-20 34 views
9

我使用节点child_process API节点的子进程的事件监听

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

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

从我用的是孩子以下

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

可我里面添加这些管事件里面的一些代码像console.log?

例如像可能与原型

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

更新

我需要的就是听这childProcess.stderr.pipe(process.stderr);,并在情况下,我和错误做process.exit(1)

当我尝试像我得到错误

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

UPDATE2

我尝试以下

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()); 
}); 

//正当我添加下面我看到错误日志

child.stderr.pipe(process.stderr) 

非控制台中.log(“im here”)打印出错

我需要以某种方式来听这个管道或可能以某种方式扩展child.stderr.pipe(process.stderr),我需要做的是process.exit(1)万一我从上面的代码语句中得到错误...

也许与JavaScript的原型,但不知道该怎么做......

请协助林卡住,我知道这不是简单的...

回答

0

您可以订阅data事件(stdout或stderr )并听它

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

例如

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,但我需要管道和process.stdout ...与它... –

+0

谢谢,但这是行不通的... :( –

+0

你能告诉那完全不工作?我添加了例子来回答 –

4

这个工作对我来说:

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"); 
}); 

控制台输出:

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

IM HERE 
close 
*/ 

在你身边的问题,也许是命令你没有按产卵” t使用stderr?

更新

如果我添加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"); 
}); 

的输出中略有不同(无接近从孩子事件)

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

可以 “玩”代码在这里:https://tonicdev.com/shanshan/cp-spawn-piping

+0

谢谢,但这不是为我工作:(唯一的是打印错误是child.stderr.pipe(process.stderr)process.stderr,我可以知道何时收到错误,所以我退出(1 )? –

+0

@shopiaT'child.stderr.on('data')'可以让你知道错误发生的时间。我在代码中加入了process.exit(1),输出有点不同。 – Shanoor