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

直接在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 ... ... 

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

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

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