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

标签 javascript node.js environment-variables

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

我们安装了 dotenv 以在项目上使用环境变量,我们的变量包含在 .env.env.development 文件中,例如这个:

.env

REACT_APP_LOGGER=LOGGER

.env.development

REACT_APP_LOGGER=NO_LOGGER

然后在代码中我们有这样的逻辑:

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

development 模式下使用 webpack 4 进行本地构建时,if 为真,而在 production 模式下为 false。

但在 azure 上,两种情况都是 false

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

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

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"));

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

最佳答案

解决方案是将两者都传递给 stringify,如下所示:

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

这样,我们可以将两个变量转换为相同的字符串格式,长度相同,值也相同,但 Azure Process 注入(inject)的环境变量不相同。

关于javascript - 将环境变量与常量进行比较时,字符串比较在 Javascript 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53394550/

相关文章:

javascript - 使用局部变量从另一个函数停止 setTime

mysql - nodejs mysql关闭和打开连接

windows - -webkit-backface-visibility 在 Windows 上的 node-webkit 中不起作用

angular - 在 Nginx 中使用 Angular 应用程序管理环境

ruby-on-rails - Rails 的环境变量

php - 如何使用php取消设置环境变量?

javascript - 如何在不加载相同 URL 的情况下镜像 iframe? CSS 未激活

javascript - 将 JS 对象数组转换为嵌套形式的最有效方法?

javascript - 如何动态创建属性并为其添加值?

node.js - 检查数组以及是否每 2 个元素缺少一个值