在child_process.exec中执行'npm install'时,控制台输出很乱

时间:2014-06-30 04:46:37

标签: node.js npm

直接在Gitbash中执行控制台输出看起来很好,如下所示:

npm info it worked if it ends with ok
npm info using npm@1.4.14
npm info using node@v0.10.29
npm info trying registry request attempt 1 at 12:38:21
npm http GET http://registry.npmjs.org/phonegap
npm http 304 http://registry.npmjs.org/phonegap
npm info installOne phonegap@3.5.0-0.20.4
...
...

但是,如果我在nodejs中以编程方式执行相同的操作,请执行以下代码片段:

var exec = require('child_process').exec;
var process = exec('npm install -g phonegap', function(err, stdout, stderr){

});

process.stdout.on('data', function(data) {
    console.info(data);
});

process.stderr.on('data', function(data) {
    console.error(data);
});

控制台输出看起来像这样一团糟:

npm

info

it worked if it ends with
ok
npm info using npm@1.4.14
npm info using
node@v0.10.29

npm

info
 trying
 registry request attempt 1 at 12:44:09
npm http GET http://registry.npmjs.org/phonegap

npm

http
 304 http://registry.npmjs.org/phonegap
...
...

有什么方法可以解决这个问题吗?感谢

2 个答案:

答案 0 :(得分:2)

console.logconsole.error在输出数据后附加换行符,并且您为每个data事件调用它们。这意味着,即使data事件只是一行的一部分,它也会获得它自己的行。

相反,您应该将数据直接写入stdout,以便它不会添加随机换行符。我也没有使用名称process,因为它已经是全球名称。

var exec = require('child_process').exec;
var phonegap = exec('npm install -g phonegap', function(err, stdout, stderr){

});
phonegap.stdout.pipe(process.stdout);
phonegap.stderr.pipe(process.stderr);

答案 1 :(得分:0)

数据事件与完整的文本行不对应。使用process.stdout.write而不是console.info。这样,每次写入都将在同一行继续,直到您明确写入\ n为止。