我试图确定运行我的节点应用的计算机上是否安装了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,认为我的回调参数错误,但他们肯定是正确的顺序:
这为我提出了两个问题:
答案 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
参数将是一个对象,包含错误代码和信号。