Javascript 从nodejs获取子派生进程的进度输出

Javascript 从nodejs获取子派生进程的进度输出,javascript,node.js,npm,npm-install,child-process,Javascript,Node.js,Npm,Npm Install,Child Process,我正在从js脚本中生成npm安装-g create react应用程序。我想实时获取输出的一部分,在那里您可以看到软件包安装过程的进度。我的意思是: 但当我执行脚本时,安装时的输出是: + create-react-app@2.1.8 added 63 packages from 20 contributors in 4.885s 更新时,请注意: + create-react-app@2.1.8 updated 1 package in 1.971s 我正在使用的代码: const run

我正在从js脚本中生成npm安装-g create react应用程序。我想实时获取输出的一部分,在那里您可以看到软件包安装过程的进度。我的意思是:

但当我执行脚本时,安装时的输出是:

+ create-react-app@2.1.8
added 63 packages from 20 contributors in 4.885s
更新时,请注意:

+ create-react-app@2.1.8
updated 1 package in 1.971s
我正在使用的代码:

const run = (cmd, args) => {
    return new Promise((resolve, reject) => {
        const spawn = require('child_process').spawn;
        const command = spawn(cmd, args);
        let result = '';
        command.stdout.on('data', data => {
            result += data.toString()
        });
        command.on('close', _ => {
            resolve(result)
        });
        command.on('error', err => {
            reject(err)
        });
    })
}

run(npmExecutable, ["install", "-g", "create-react-app"]).then(result => {
    console.log(result);
});
所以,有可能在你能看到进度条的地方获得渴望的实时输出

编辑:嗯,根据我现在可以看到进度条,但是我如何才能将这个结果进度条实时输出到stdout,我的意思是一个变量

这是新代码:

const run = (cmd, args) => {
    return new Promise((resolve, reject) => {
        const spawn = require("child_process").spawn;
        const command = spawn(cmd, args, {
            stdio: "inherit"
        });
        command.on("close", _ => {
            resolve();
        });
        command.on("error", err => {
            reject(err);
        });
    });
};

编辑关于重复:我的问题与另一个问题不同,因为现在我正试图使用从另一个问题收到的答案评论来解决另一个问题

NPM在通过管道引导输出时避免使用动画和进度条。假设这是顶级父进程,您可以指定一个选项将所有STDIO选项定向到主机

const command = spawn(cmd, args, {stdio: 'inherit'});

你确定吗?我认为这是不可能的,因为你正在产生一个过程。您需要使用侦听器拦截该生成过程,以获得正确的数据。在审阅文档并对其进行测试后,我更新了我的答案。您是如何尝试的?我现在得到的是一个错误:command.stdout.ondata,函数数据{^TypeError:如果删除command.stdout.on节,则无法读取Null的属性“on”,是的,它确实有效。如果需要进一步说明,这里是我在运行它的屏幕截图时使用的确切代码。是的,有效。但现在唯一的一件事是,我需要将此结果存储在一个变量中,以一种我不知道这是否可能。你试过了吗?可能是重复的不,不是。这是问题的下一个阶段。