簡體   English   中英

如何檢查 Node.js 中是否設置了環境變量?

[英]How can I check if an environment variable is set in Node.js?

我想檢查我的Express JS服務器中是否設置了環境變量,並根據是否設置執行不同的操作。

我試過這個:

if(process.env.MYKEY !== 'undefined'){
    console.log('It is set!');
} else {
    console.log('No set!');
}

我在沒有process.env.MYKEY的情況下進行測試,但控制台打印“它已設置”。

這在我的 Node.js 項目中運行良好:

if(process.env.MYKEY) { 
    console.log('It is set!'); 
}
else { 
    console.log('No set!'); 
}

編輯:

請注意,正如@Salketer 提到的,取決於需要,虛假值將在上面的代碼段中被視為false 如果虛假值被視為有效值。 使用hasOwnProperty或再次檢查塊內的值。

> x = {a: ''}
{ a: '' }
> x.hasOwnProperty('a')
true

或者,隨意使用 in 運算符

if ("MYKEY" in process.env) {
    console.log('It is set!');
} else {
    console.log('No set!');
}

我使用此代碼段來確定是否設置了環境變量

if ('DEBUG' in process.env) {
  console.log("Env var is set:", process.env.DEBUG)
} else {
  console.log("Env var IS NOT SET")
}

理論說明

NodeJS 8 文檔中所述:

process.env屬性返回一個包含用戶環境的對象。 環境(7)

[...]

process.env上分配一個屬性會將值隱式轉換為字符串。

 process.env.test = null console.log(process.env.test); // => 'null' process.env.test = undefined; console.log(process.env.test); // => 'undefined'

但是,當未在環境中設置變量時, process.env對象中根本不存在相應的鍵,並且process.env的相應屬性是undefined

這是另一個示例(請注意示例中使用的引號):

console.log(process.env.asdf, typeof process.env.asdf)
// => undefined 'undefined'
console.log('asdf' in process.env)
// => false

// after touching (getting the value) the undefined var 
// is still not present:
console.log(process.env.asdf)
// => undefined

// let's set the value of the env-variable
process.env.asdf = undefined
console.log(process.env.asdf)
// => 'undefined'

process.env.asdf = 123
console.log(process.env.asdf)
// => '123'

關於代碼風格的旁注

我將答案中這個尷尬而奇怪的部分從 StackOverflow 移開:它就在這里

為什么不檢查環境變量中是否存在密鑰?

if ('MYKEY' in Object.keys(process.env))
    console.log("It is set!");
else
    console.log("Not set!");

由於值(如果存在)將是一個字符串,如文檔中所述:

process.env.test = null;
console.log(process.env.test);
// => 'null'
process.env.test = undefined;
console.log(process.env.test);
// => 'undefined'

並且可以返回空字符串(在CI流程+ GCP服務器中發生在我身上),

我將創建一個函數來清除process.env中的值:

function clean(value) {
  const FALSY_VALUES = ['', 'null', 'false', 'undefined'];
  if (!value || FALSY_VALUES.includes(value)) {
    return undefined;
  }
  return value;
}

const env = {
  isProduction: proces.env.NODE_ENV === 'production',
  isTest: proces.env.NODE_ENV === 'test',
  isDev: proces.env.NODE_ENV === 'development',
  MYKEY: clean(process.env.MYKEY),
};

// Read an environment variable, which is validated and cleaned
env.MYKEY           // -> 'custom values'

// Some shortcuts (boolean) properties for checking its value:
env.isProduction    // true if NODE_ENV === 'production'
env.isTest          // true if NODE_ENV === 'test'
env.isDev           // true if NODE_ENV === 'development'

編輯(刪除舊的錯誤答案)

正如maxkoryukov所說,應該是:

# in test.js

if ("TEST_ENV" in process.env) {
    console.log("TRUE: " + process.env["TEST_ENV"])
} else {
    console.log("FALSE")
}

以下測試確實如此:

$> node test.js
FALSE
$> export TEST_ENV="SOMETHING"
$> node test.js
TRUE: SOMETHING

當變量為空字符串(在新的 bash 會話/終端窗口中測試)時,這也有效。

$> node test.js
FALSE
$> export TEST_ENV=""
$> node test.js
TRUE:

我確實練習使用內置的Node.js 斷言庫

const assert = require('assert');

assert(process.env.MY_VARIABLE, 'MY_VARIABLE is missing');
// or if you need to check some value
assert(process.env.MY_VARIABLE.length > 1, 'MY_VARIABLE should have length greater then 1');

我使用在index.js之上添加此驗證,並使其與代碼要求保持同步。 如果由於某種原因 .env.example 不在代碼中,這種方式也很容易檢查項目需要哪些變量。

如果你用你的 if 語句賦值,你可以這樣做

var thisIsSet = 'asddas';
var newVariable = thisIsSet ||'otherValue'
console.log(newVariable)

結果為 asddas

這是檢查環境變量的好方法

if (process.env.YOUR_ VARIABLE) {
    // If your variable is exist
}

否則,如果您想檢查多個環境變量,可以檢查此node module

節點環境檢查器

您可以創建.env.example來存儲應用程序所需的所有環境變量。
在此之后,您可以加載此.env.example並與.env進行比較。

這樣,您可以在應用程序啟動時檢查所有必需的環境。

要最小化任務,您可以使用scan-env npm 包,它的作用相同。

const scanEnv = require("scan-env");

const scanResult = scanEnv();

if (!scanResult) {
  console.error("Environment variables are missing.");
}

使用 scan-env 的教程

您可以使用 || 輕松解決具有默認值歸屬情況的運算符 env var 不存在:

const mykey = process.env.MYKEY || '1234';
let dotenv;

try {
  dotenv = require('dotenv');
  dotenv.config();
}
catch(err) {
  console.log(err);
  // if vars are not available...
}

//... vars should be available at this point

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM