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

时间:2016-12-27 15:23:28

标签: node.js

我正在通过Node.js以编程方式执行shell命令,结果是true ...字面上<string> true,但我无法将它与boolean和{{1}进行比较}}

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 }); 以防万一,但结果是一样的。我很迷惑。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

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做任何奇怪的事情。通常情况下,程序会在其控制台输出中附加换行符,特别是如果人类正在查看它。事实上,这是one of the things console.log()为您做的。

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

甚至文件通常以换行符结束,因为这个makes it easier可以将来自各种来源(例如日志文件)的数据连接在一起并使用UNIX工具。还有一种广泛的做法是让您的代码编辑器为您强制执行此操作。简而言之,你会看到这一切。

childProcess.exec()方法没有对这些新行约定做出任何假设,它对于它来说太低级了,所以它使它们保持原位。除了tiny modules的问题之外,您可以轻松地在exec()之上创建一个抽象来处理修剪。