奇数exec节点中输出

我试图确定运行我的节点应用程序的计算机上是否安装了Java运行时环境。 这里是我开始build立的承诺,以确定它是否安装:

FileSystemTools.prototype.checkToSeeIfJavaRuntimeEnvIsAvailable = function (){ return new Promise((resolve, reject) => { exec('java -version', (error, stdout, stderr) => { if(error) reject(error) if(stderr) reject(stderr) resolve(stdout) }) }) } 

我正在构build运行此检查的生成器函数看起来像这样到目前为止:

 co(function *(){ let jreVersion = yield fst.checkToSeeIfJavaRuntimeEnvIsAvailable() console.log(jreVersion) }).catch(error => { throw new Error(error) }) 

当我运行这个时,我根本得不到任何输出。 但是,如果我parsing了从exec命令返回的所有参数:

  FileSystemTools.prototype.checkToSeeIfJavaRuntimeEnvIsAvailable = function (){ return new Promise((resolve, reject) => { exec('java -version', (error, stdout, stderr) => { // resolving early with everything to see what's going on resolve({error, stdout, stderr}) if(error) reject(error) if(stderr) reject(stderr) resolve(error, stdout, stderr) }) }) } 

我看到,我的命令是成功的触发,但它返回标准错误的结果,而不是标准输出:

 { error: null, stdout: '', stderr: 'java version "1.8.0_101"\nJava(TM) SE Runtime Environment (build 1.8.0_101-b13)\nJava HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)\n' } 

我仔细检查了execcallback的文档,认为我得到的callback参数是错误的,但他们肯定是在正确的顺序:

exec回调参数顺序

这对我提出了两个问题:

  1. 为什么我的成功输出的命令返回标准错误?
  2. 如果它在标准错误中返回,为什么我的if语句检查标准错误,并拒绝它是否真的不起作用?

默认情况下,即使命令执行成功, java -version只会将结果写入标准错误。 你可以通过将stderrredirect到一个文件来确认,就像这样

 $ sh -c "java -version 2>/tmp/test" $ cat /tmp/test java version "1.8.0_102" Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) 

如果出现错误,则callback中的error参数将是一个对象,包含错误代码和信号。