节点子进程事件监听

Posted

技术标签:

【中文标题】节点子进程事件监听【英文标题】:Node child process event listen 【发布时间】:2016-04-26 06:25:55 【问题描述】:

我使用节点 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);
        
    );

更新2

我尝试以下方法

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") 不打印以防出错

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

也许使用 javascript 原型,但不知道该怎么做...

请帮助我卡住了,我知道这并不简单......

【问题讨论】:

【参考方案1】:

这对我有用:

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

输出略有不同(没有来自孩子的 close 事件)

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

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

【讨论】:

谢谢,但这对我不起作用 :( 唯一打印错误的是 child.stderr.pipe(process.stderr) process.stderr,我可以知道什么时候有错误是收到所以我退出(1)? @shopiaT child.stderr.on('data') 让您知道何时发生错误。我在我的代码中添加了 process.exit(1) 并且输出有点不同。【参考方案2】:

您可以订阅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());
);

【讨论】:

你能说这完全行不通吗?我添加了示例来回答 谢谢,但这不起作用我需要听错误请看我的更新 child.stderr.on('data', function (buf) process.exit(1););?我是否正确理解您要退出程序然后收到 stderr 的第一部分? 是的,我需要它退出,当我尝试您的建议并得到错误时,它没有被调用......打印错误的唯一内容是 child.stderr.pipe(process.stderr),错误来自process.stderr,我需要以某种方式检测它是否已打印并退出...有可能吗?

以上是关于节点子进程事件监听的主要内容,如果未能解决你的问题,请参考以下文章

Laravel之事件

3.1.1 基于监听的事件处理机制

监听容器中的文件系统事件

Android进程间通信之内部类作为事件监听器

[javaSE] GUI(事件监听机制)

Android零基础入门第33节:Android事件处理概述