關於 NODE_ENV 的地雷

一個會懷疑人生的 bug。

簡述

在講 bug 之前先幫你複習一下 NODE_ENV 的用法:

  1. 到 package.json 設定 script
1
2
3
4
5
6
{
"scripts": {
"test": "jest",
"start": "set NODE_ENV=hello && node index.js"
}
}
  1. 到對應的檔案裡面寫 JS
1
2
// index.js
console.log('my NODE_ENV: ' + process.env.NODE_ENV);
  1. 最後用 npm run 的方式來執行(只有透過這種方式才能存取到寫在 script 中的環境變數)
1
npm run start

輸出結果:

1
my NODE_ENV: hello

看起來很合理,但這時候如果你這樣寫:

1
console.log('is equal: ', process.env.NODE_ENV === 'hello'); // true / false ?

我本來也想說不就 true 嗎?內容一樣,型別也正確,有什麼好 false 的?

但是,結果確實是 false

揭開幕後

就直接說吧,其實是因為「空白字元」的關係:

1
2
3
4
5
6
7
{
"scripts": {
"test": "jest",
// NODE_ENV=hello(空格)&&(空格)node index.js
"start": "set NODE_ENV=hello && node index.js"
}
}

你可以試著用 JSON.stringify 印出來看就知道原因了:

1
2
NODE_END:  "hello "  // <- 結尾多一個空格
My string: "hello"

所以結論就是空白字元的關係才導致 false 的,把空格拿掉就正常了:

1
2
3
4
5
6
{
"scripts": {
"test": "jest",
"start": "set NODE_ENV=hello&& node index.js"
}
}
1
2
3
console.log('NODE_END: ',  JSON.stringify(process.env.NODE_ENV));
console.log('My string: ', JSON.stringify('hello'));
console.log('Is equal: ', process.env.NODE_ENV === 'hello');

輸出結果:

1
2
3
NODE_END:  "hello"
My string: "hello"
Is equal: true

所以以後在用這種東西時,最好確保 && 前後沒出現空白字元,不然就會像我一樣被雷的不要不要的。

Node.js 中的 path 相關方法 從解讀 Sequelize 的執行檔來學習 Node.js 的檔案相關 API
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×