如何检查 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
来确定数组是否包含项目。查看文档:in
和 Object.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 中是不是设置了环境变量?的主要内容,如果未能解决你的问题,请参考以下文章