代码之家  ›  专栏  ›  技术社区  ›  Miguel Angel

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

  •  4
  • Miguel Angel  · 技术社区  · 7 年前

    我们有一个简单的React应用程序,用CRA1.X创建。

    我们安装 dotenv 在项目中使用环境变量,我们的变量包含在 .env 和 .env.development 像这样的文件:

    Env

    REACT_APP_LOGGER=LOGGER
    

    .环境发展

    REACT_APP_LOGGER=NO_LOGGER
    

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

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

    在本地版本上使用Webpack4 development 如果设置为真,则打开 production 模式是错误的。

    但在Azure上,这两种情况都是错误的

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

    我们已经检查了 process.env.REACT_APP_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"));
    

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Miguel Angel    7 年前

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

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

    这样,我们可以以相同的字符串格式对两个变量进行强制转换,两个变量的长度相同,值相同,但由Azure进程注入的环境变量不同。