节点子进程事件侦听

sho*_*a T 10 javascript javascript-events spawn child-process node.js

我使用节点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);
Run Code Online (Sandbox Code Playgroud)

从孩子我使用以下

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
Run Code Online (Sandbox Code Playgroud)

我可以在这些管道事件里面添加一些代码如console.log吗?

例如,可能与原型

child.on('error', function(err) {
        console.log(err);
    });
Run Code Online (Sandbox Code Playgroud)

更新

我需要的是听听这个childProcess.stderr.pipe(process.stderr);,以防我得到错误process.exit(1)

当我尝试像我得到错误的东西

    child.stderr.pipe(function () {
            console.log("im here");
            process.stderr;
            process.exit(1);
        }
    );
Run Code Online (Sandbox Code Playgroud)

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());
});
Run Code Online (Sandbox Code Playgroud)

//当我添加以下内容时,我会在日志中看到错误

 child.stderr.pipe(process.stderr)
Run Code Online (Sandbox Code Playgroud)

如果出错,则打印不是console.log("im here")

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

也许与javascript原型但不知道如何做到这一点......

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

Sha*_*oor 5

这对我有用:

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");
});
Run Code Online (Sandbox Code Playgroud)

控制台输出:

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

IM HERE
close
*/
Run Code Online (Sandbox Code Playgroud)

在你身边的问题,也许你正在产生的命令不使用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");
});
Run Code Online (Sandbox Code Playgroud)

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

/*
IM HERE - Error
test: ls: invalid option -- 'z'
Try 'ls --help' for more information.
*/
Run Code Online (Sandbox Code Playgroud)

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


Ale*_* B. 0

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

child.stdout.on('data', function (buf) {
    console.log(buf.toString());
});
Run Code Online (Sandbox Code Playgroud)

例如

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());
});
Run Code Online (Sandbox Code Playgroud)