节点中的奇数exec输出

时间:2016-10-19 14:22:26

标签: javascript node.js process exec

我试图确定运行我的节点应用的计算机上是否安装了Java运行时环境。这是我开始构建以确定它是否已安装的承诺:

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

我建立运行此检查的生成器功能到目前为止看起来像这样:

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

当我运行时,我根本没有输出。但是,如果我解析从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' 
}

我仔细检查the docs on the exec callback,认为我的回调参数错误,但他们肯定是正确的顺序:

exec callback parameter order

这为我提出了两个问题:

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

1 个答案:

答案 0 :(得分:1)

默认情况下,java -version仅将结果写入标准错误,即使命令执行成功也是如此。您可以通过将stderr重定向到文件来确认,如此

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

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