Warm tip: This article is reproduced from serverfault.com, please click

node.js-将环境变量与常量进行比较时,字符串比较在Javascript中不起作用

(node.js - String comparison not working in Javascript when comparing an environment variable with a constant)

发布于 2018-11-20 13:53:57

我们有一个使用CRA 1.x创建的简单React应用程序。

我们安装dotenv了在项目上使用环境变量的程序,并且我们的变量包含在.env.env.development文件中,如下所示:

.env

REACT_APP_LOGGER=LOGGER

.env。发展

REACT_APP_LOGGER=NO_LOGGER

然后在代码中,我们具有以下逻辑:

if(process.env.REACT_APP_LOGGER === "LOGGER") {
    // do something
}

development模式为webpack 4的本地版本中,if为true,而onproduction模式为false。

但天蓝色,在两种情况下都是错误的

process.env.REACT_APP_LOGGER === "LOGGER" // false

我们已经检查了的值,process.env.REACT_APP_LOGGER它是“ LOGGER”类型,string但是代码返回的是怪异的值:

console.log(process.env.REACT_APP_LOGGER)
console.log(process.env.REACT_APP_LOGGER === "LOGGER")
console.log(process.env.REACT_APP_LOGGER == "LOGGER")
console.log(typeof process.env.REACT_APP_LOGGER)

这是前面的代码生成的输出:

LOGGER
false
false
string

我在做错什么吗?奇怪的是,我们还有其他类似这样的字符串比较,它们正在正确地进行比较。

process.env.NODE_ENV === "production" // true 

编辑:当我们查看转译的代码时,我们看到以下内容:

console.log("LOGGER"),
console.log(!1),
console.log(!1),
console.log(f("LOGGER"));

所以我想这意味着比较是在构建期间完成的(因为这是一个常数,所以很有意义)。

Questioner
Miguel Angel
Viewed
0
Miguel Angel 2019-01-31 05:00:09

解决方案是通过两个都进行字符串化,如下所示:

JSON.stringify(process.env.REACT_APP_LOGGER) === JSON.stringify("LOGGER")

通过这种方式,我们可以将两个变量转换为相同的字符串格式,都具有相同的长度,并且都具有相同的值,但是Azure Process注入的环境变量并不相同。