如何检查 Node.js 中是不是设置了环境变量?

Posted

技术标签:

【中文标题】如何检查 Node.js 中是不是设置了环境变量?【英文标题】: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 作为值 【参考方案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 operator 在ECMA262, 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 请检查这个答案:***.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 请检查这个答案:***.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'

关于代码风格的旁注

我将答案中这个尴尬而奇怪的部分从 *** 移开: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 不在代码中,这种方式也很容易检查项目需要哪些变量。

【讨论】:

以上是关于如何检查 Node.js 中是不是设置了环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

node.js安装后输入“node -v”提示'node' 不是内部或外部命令,也不是可运行的程序的解决方法

Node.js 永远带有环境变量

electron-builder,如何设置节点环境变量

Node.js:如何从系统中读取变量?

怎么把node.js的bin添加到环境变量

npm/node 下载安装,环境变量设置