节点subprocess事件监听
我使用节点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);
我可以在这些pipe道事件里面添加一些像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)
console.log(“im here”)的错误将被打印
我需要以某种方式来听这个pipe道,或者也许以某种方式扩展child.stderr.pipe(process.stderr),我需要做的是process.exit(1)
,如果我从上面的代码语句中得到错误…
也许与JavaScript的原型,但不知道如何做到这一点…
请协助Im卡住,我知道这并不简单…
这适用于我:
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 */
在你身边的问题,也许你正在产卵的命令不使用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
您可以订阅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()); });