2016-12-27 63 views
0

我執行shell命令通過編程Node.js的,其結果是true ...字面上<string> true,但我不能把它比既不boolean也不string相媲美。Node.js的標準輸出值不是字符串或布爾

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()以防萬一,但結果是一樣的。我很困惑。有任何想法嗎?

+1

'stdout'是一個流。 – Scimonster

+1

也許是因爲'\ n'結尾。你嘗試過'stdout.startsWith('true')'? –

+0

@ShreyashSSarnayak,這麼簡單......你是對的! – Milkncookiez

回答

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 thingsconsole.log()爲你做。

想象一下,如果您每天使用的程序(lsgit,...)在沒有換行符的情況下終止其輸出,請使用您的終端。您的提示(您鍵入的標記,例如$)將與最後一個程序的輸出擁擠在同一行。呸!

即使文件通常以換行符結尾,因爲這makes it easier來連接來自各種來源(如日誌文件)的數據,並與UNIX工具一起使用。您的代碼編輯器爲您執行此操作也有廣泛的做法。總之,你會看到這個地方。

childProcess.exec()方法不會對這些換行約定做任何假設,因爲它太低級,所以它將它們保留在適當的位置。拋開tiny modules的問題,您可以輕鬆地在exec()之上創建一個抽象,爲您處理裁剪。

+0

現在你已經提到它了,我注意到'stdout'的值後面總是有一個空行,所以最後有一個'\ n'。 TNX! – Milkncookiez

+1

沒問題@Milkncookiez。我添加了一些您可能感興趣的背景和背景。 –

相關問題