【问题标题】:How can I check if an environment variable is set in Node.js?如何检查 Node.js 中是否设置了环境变量?
【发布时间】:2015-07-14 20:19:13
【问题描述】:

我想检查我的Express JS服务器中是否设置了环境变量,并根据是否设置执行不同的操作。

我试过了:

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

我在没有process.env.MYKEY 的情况下进行测试,但控制台显示“已设置”。

【问题讨论】:

  • 去掉'undefined'周围的单引号就可以了。
  • 如果要检查未定义,则需要使用 typeof: if(typeof process.env.MYKEY !== 'undefined')
  • @ChillyPenguin,确切地说,我们应该说,两者都是有效的:1)SOMEVAR === undefined 和 2)typeof SOMEVAR === 'undefined'但是第二种方式更可取,因为它不使用undefined 作为值

标签: javascript node.js environment-variables


【解决方案1】:

这在我的 Node.js 项目中运行良好:

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

编辑:

请注意,正如@Salketer 提到的,取决于需要,虚假值将在上面的 sn-p 中被视为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!');
}

【讨论】:

  • 由于这似乎多年来一直受到支持,我只想指出,如果环境变量的值是假值,它可能不会产生预期的结果。
  • @Salketer 是的,我想如果是空字符串。这也意味着它尚未设置。
  • 我在这个问题上的解决方案检查密钥的存在而不是真实性,因此更适合虚假字符串或数字值。
  • @maxkoryukov 如果您认为我的回答有误,请批评我的回答。
  • @kucing_terbang,根据文档,in operatorECMA262, 3d Edition (1999)第 54 页)中被提及,并在许多旧版本的 JS 引擎中实现。所以没有人需要拥有最新版本的 NodeJS,因为它是一项相当古老的功能。
【解决方案2】:
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

【讨论】:

  • 通常最好在您的代码中包含一些解释,以描述您的答案如何解决问题以及为什么它与现有接受的答案不同。
  • 我已经用解释更新了答案。不知道为什么不显示。
  • 有更简单的解决方案,无需使用 3d 方包。此外,所附示例没有显示如何检查某个变量XXX(或任何其他)是否已在环境中设置。换句话说,这不是 OP 问题的答案。
【解决方案3】:

这是检查环境变量的好方法

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

否则,如果你想检查多个环境变量,你可以检查这个node module

node-envchecker

【讨论】:

  • 一个空字符串 ""undefined — 绝对是不同的值,但都是 falsey。但是您在此处提供的 sn-p 无法区分它们。因此,如果变量 已设置,但其值为空字符串(这是合法的),您的代码将表现得像未设置变量一样。这不是错误吗?
  • 关于提供的包的相同错误 - 在版本 1.0.8 (here) 中,您使用相同的代码来检查 变量是否为 falsey
  • 请检查这个答案:stackoverflow.com/a/57648040/1115187
【解决方案4】:

为什么不检查环境变量中是否存在key?

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

【讨论】:

  • 您使用的是哪个节点版本?对我来说(process.env 中的'MYKEY')在节点 10.15.3 上工作
  • 是的 @YuriRodrigoDosSantos 在新版本的节点上对我有用。我避免使用旧的。
  • 错误答案。您不能使用in 来确定数组是否包含项目。查看文档:inObject.keys。简而言之 - 在答案中,您正在检查数组(作为对象)是否具有名为 MYKEY 的属性。 property 不是 item
  • 请检查这个答案:stackoverflow.com/a/57648040/1115187
  • @maxkoryukov 你是对的 - in 检查属性而不是项目,所以不合适。 'length' in ['a']; // true'a' in ['a']; // false.
【解决方案5】:

如果你用你的 if 语句赋值,你可以这样做

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

结果为 asddas

【讨论】:

  • 有时,我只需要检查变量的存在而不是使用它的值。所以,我认为,这不是一个答案。
【解决方案6】:

我用这个sn-p来查看是否设置了环境变量

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

理论说明

NodeJS 8 docs中提到的:

process.env 属性返回一个包含用户环境的对象。见environ(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 移开:it is here

【讨论】:

  • 我只是想投票赞成这个答案,但结果证明这是我的。生活就是这么荒谬……
【解决方案7】:

EDIT(删除旧的错误答案)

正如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:

【讨论】:

  • 1.只是一个旁注:typeof xxxx === "undefined" 是一种规范的方式;)
  • 2.你的代码工作得很好!但是,哪一个食谱更容易阅读?
  • if (some_var_name in process.env) { /* your code , if the variable is defined */ }
  • 已更新。如果不正确请编辑。谢谢你的正确。
  • 你的回答也是正确的!!您以前版本的代码按预期工作;)我刚刚添加了有关代码样式的建议(这始终只是您偏好的问题)。另外,如果您批评我的answer,我会很高兴。谢谢!
【解决方案8】:

因为值(如果存在)将是一个字符串,如documentation中所述:

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'

【讨论】:

    【解决方案9】:

    您可以创建.env.example,它存储应用程序所需的所有环境变量。
    在此之后,您可以加载此 .env.example 并与 .env 进行比较。

    这样,您可以在应用程序启动时检查所有需要的环境。

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

    const scanEnv = require("scan-env");
    
    const scanResult = scanEnv();
    
    if (!scanResult) {
      console.error("Environment variables are missing.");
    }
    

    tutorial to use scan-env

    【讨论】:

      【解决方案10】:

      您可以使用 || 轻松解决具有默认值归属情况的运算符 env var 不存在:

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

      【讨论】:

      • 这是个坏主意。您不希望您的生产代码使用默认值运行。
      • 如果默认值或没有任何值,生产将崩溃。我不明白你的意思。
      • 它会在报告问题时总是崩溃,还是会做一些意想不到的事情、难以追踪,甚至继续以错误的配置运行?
      • 你推荐的方法是什么?
      • 如何检查 Node.js 中是否设置了环境变量?编写一个验证器。
      【解决方案11】:

      我确实练习使用内置的Node.js assert library

      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 不在代码中,这种方式也很容易检查项目需要哪些变量。

      【讨论】:

        猜你喜欢
        • 2015-06-23
        • 1970-01-01
        • 2019-11-13
        • 2013-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多