【问题标题】:Proper way to parse environment variables解析环境变量的正确方法
【发布时间】:2020-01-05 11:16:40
【问题描述】:

我基本上在我所有的项目中都使用node-config,而且大部分时间我都遇到了解析设置为环境变量的布尔值和数字的问题。

例如

default.js

module.exports = { 
    myNumber = 10,
    myBool = true
}

自定义环境变量.js

module.exports = { 
    myNumber = "MY_NUMBER",
    myBool = "MY_BOOL"
}

现在,明显的问题是,如果我用设置为环境变量的自定义值覆盖默认值,它们将是字符串值,而不是数字或布尔值。所以现在,要确保在我的代码中类型是正确的。我总是必须进行类型转换,对于布尔值使用适当的库,例如yn。问题是我每次使用config.get() 时都必须进行此转换,例如+config.get("myNumber")yn(config.get("myBool"))

有没有更好更优雅的方法来做到这一点?

我看到的一个解决方案是将类型属性添加到环境变量中,因为它是使用格式完成的here。这将允许做这样的事情......

自定义环境变量.js

module.exports = { 
    myNumber = {
        name: "MY_NUMBER",
        type: "number"
    },
    myBool = {
        name: "MY_BOOL",
        type: "boolean"
    }
}

node-config 将处理类型转换,并且在获取它时无需一直在代码中执行此操作。当然,需要为布尔值实现适当的解析器,但那些已经存在并且可以在这里使用。

【问题讨论】:

    标签: node.js node-config


    【解决方案1】:

    默认情况下,环境变量将被解析为字符串。 在 node-config 中,我们可以使用__format 覆盖此行为,如下所示。

    我们不需要任何额外的库。普通的 json 数据类型,如 boolean、number、nested json 等,应该可以正常工作。

    举一个容易关联的例子。

    config/default.json

    {
      "service": {
        "autostart": false
      }
    }
    

    自定义环境变量.json

    {
      "service": {
        "autostart": {
          "__name": "AUTOSTART",
          "__format": "json"
        }
      }
    }
    

    现在我们可以在需要覆盖时传递环境变量,基本类型不需要类型对话。

    【讨论】:

    • 有一个与该问题相关的open PR on GitHub 以使__format 在数字和布尔值的情况下更加具体,但通常您的答案也可以
    【解决方案2】:

    node-config v3.3.2 现在支持此功能,请参阅changelog

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多