javascript - Node 中的奇数执行输出

标签 javascript node.js process exec

我正在尝试确定运行我的 Node 应用程序的计算机上是否安装了 Java 运行时环境。这是我开始构建以确定它是否已安装的 promise :

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 语句检查标准错误并拒绝它是否为真?

最佳答案

默认情况下,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 参数将是一个对象,包含错误代码和信号。

关于javascript - Node 中的奇数执行输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40134136/

相关文章:

node.js - 在 Travis-CI 上通过 mocha 运行 npm test 时权限被拒绝

node.js - 导出 NODE_ENV=生产不会更改 gulpfile.js 中的 process.env.NODE_ENV

c# - Process.Kill() 似乎没有终止进程

PHP 检查进程 ID

javascript - 为什么我的 InDesign Javascript 无法完全运行?

javascript - html 元素呈现为变量名称

javascript - reCAPTCHA 已在此元素中呈现

javascript - 使 CSS 缩放到移动 View 的最佳方法

javascript - 将 async/await 与 forEach 循环结合使用

c# - 仅当使用 Process.Start() 在 C# 中作为外部程序运行时,C 控制台程序才会在退出时崩溃(访问冲突)