node.js调用外部exe并等待输出

时间:2015-12-30 23:25:58

标签: javascript node.js express cmd

我只想从nodejs-App调用外部exe。这个外部exe进行一些计算并返回nodejs-App所需的输出。但我不知道如何在nodejs和外部exe之间建立连接。所以我的问题:

  1. 如何从nodejs中正确调用具有特定参数的外部exe文件?
  2. 我如何有效地将exe的输出传输到nodejs?
  3. Nodejs应该等待外部exe的输出。但是nodejs如何知道exe何时完成处理?然后我如何提供exe的结果?我不想创建一个临时文本文件,我将输出写入,而nodejs只是读取此文本文件。有什么办法可以直接将exe的输出返回给nodejs吗?我不知道外部exe如何直接将其输出传递给nodejs。 BTW:exe是我自己的程序。因此,我可以完全访问该应用程序,并可以进行任何必要的更改。欢迎任何帮助...

2 个答案:

答案 0 :(得分:12)

  1. 使用child_process模块。
  2. 使用stdout。
  3. 代码看起来像这样

    var exec = require('child_process').exec;
    
    var result = '';
    
    var child = exec('ping google.com');
    
    child.stdout.on('data', function(data) {
        result += data;
    });
    
    child.on('close', function() {
        console.log('done');
        console.log(result);
    });
    

答案 1 :(得分:2)

您想使用child_process,您可以根据需要使用exec或spawn。 Exec将返回一个缓冲区(它不活动),spawn将返回一个流(它是实时的)。两者之间也有一些偶然的怪癖,这就是为什么我做的有趣的事情,我开始下午。

以下是试图为您运行npm install的tool I wrote的修改示例:

var spawn = require('child_process').spawn;

var isWin = /^win/.test(process.platform);
var child = spawn(isWin ? 'cmd' : 'sh', [isWin?'/c':'-c', 'npm', 'install']);
child.stdout.pipe(process.stdout); // I'm logging the output to stdout, but you can pipe it into a text file or an in-memory variable
child.stderr.pipe(process.stderr); 
child.on('error', function(err) {
    logger.error('run-install', err);
    process.exit(1); //Or whatever you do on error, such as calling your callback or resolving a promise with an error
});
child.on('exit', function(code) {
    if(code != 0) return throw new Error('npm install failed, see npm-debug.log for more details')
    process.exit(0); //Or whatever you do on completion, such as calling your callback or resolving a promise with the data
});