繁体   English   中英

解析环境变量的正确方法

[英]Proper way to parse environment variables

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

例如

默认.js

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

自定义环境变量.js

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

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

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

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

自定义环境变量.js

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

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

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

我们不需要任何额外的库。 普通的 json 数据类型,如布尔值、数字、嵌套 json 等,应该可以很好地工作。

举一个容易关联的例子。

配置/默认.json

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

自定义环境变量.json

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

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

node-config v3.3.2 现在支持此功能,请参阅更改日志

我使用这种方法:

const toBoolean = (dataStr) => {
  return !!(dataStr?.toLowerCase?.() === 'true' || dataStr === true);
};

如果您也希望 0 解析为 true,则可以添加案例:

const toBoolean = (dataStr) => {
  return !!(dataStr?.toLowerCase?.() === 'true' || dataStr === true || Number.parseInt(dataStr, 10) === 0);
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM