Node.js STDOUT 值无法与字符串或布尔值进行比较



我正在通过 Node 以编程方式执行 shell 命令.js结果是true...从字面上看<string> true,但我既不能将其与boolean进行比较,也不能与string进行比较.

const exec = require('child_process').exec;
exec('docker inspect -f {{.State.Running}} service-redis', (err, stdout, stderr) => {
// here stdout has value "true"
console.log(typeof stdout) // returns "string"
console.log(stdout == 'true') // returns false
console.log(stdout == true) // returns false
});

我尝试转换stdout.toString()以防万一,但结果是一样的。我很困惑。有什么想法吗?

您需要修剪字符串,因为它末尾以换行符的形式具有不可见的空格。

const exec = require('child_process').exec;
exec('docker inspect -f {{.State.Running}} service-redis', (err, stdout, stderr) => {
// here stdout has value "true"
console.log(stdout.trimRight() === 'true')
});

请注意,尾随换行符不是 Node 在做任何奇怪的事情。通常情况下,程序会在其控制台输出后附加换行符,尤其是在有人查看它的情况下。事实上,这是console.log()为你做的事情之一。

想象一下,如果您每天使用的程序(lsgit、...)在没有换行符的情况下终止了它们的输出,那么使用你的终端。您的提示(您键入位置之前的标记,例如$) 将与最后一个程序的输出挤在同一行上。呸!

甚至文件通常也以换行符结尾,因为这样可以更轻松地将来自各种来源(例如.log文件)的数据连接在一起并使用 UNIX 工具。还有一个广泛存在的做法是让你的代码编辑器为你强制执行这一点。简而言之,你会到处看到这一点。

childProcess.exec()方法不会对这些换行符约定做出任何假设,它太低级别了,因此它会将它们保留在原位。撇开小模块的问题不谈,您可以轻松地在exec()之上创建一个抽象来为您处理修剪。

最新更新