【问题标题】:Dynamic settings in config.json from environment来自环境的 config.json 中的动态设置
【发布时间】:2020-03-28 00:16:39
【问题描述】:

在我的 config.json 中,我需要根据环境变量设置动态填充设置对象。

"somesetting": {
    "setting1": "%S1%",
    "setting2": "%S2%"
}

我的环境是 Windows。

我遇到的许多示例都有硬编码值,我无法理解如何处理我的场景。我对 npm 和 javascript 世界很陌生。非常感谢您对此事的任何建议/参考

编辑 2: 可能,我错过了,但我的情况是 %S1% 和 %S2% 的值在不同的环境中可能不同。将 S1 和 S2 视为一些路径,这些路径可能会根据我的代码在云上构建的机器而有所不同,例如C:\xyzD:\xyz 等,我无法预先知道。所以这意味着即使我的环境不同,我也不能在其中设置静态设置。 谢谢

【问题讨论】:

  • 离题,但我使用 conf 包,读取,写入 json 没有问题

标签: javascript node.js npm config


【解决方案1】:

JSON 是一个静态文件,它的内容是一个字符串,所以这里不能使用变量。

您可以尝试使用fs 模块readFilewriteFile 通过javascript 重写json 文件。

也许像 HandlebarsMustache 这样的模板引擎会帮助您更轻松地完成这项工作。

但通常开发人员为一种环境使用一个静态文件。您只能在启动应用程序之前更改配置,否则您可能会在运行时破坏它(对您的用户和客户来说太糟糕了)。

看看这个 https://www.npmjs.com/package/config 它是基于 JSON 的配置。 我们使用这个包已经很多年了,它在一些环境中相当不错。

基础设施

config/
- default.json
- development.json
- staging.json
- production.json
app.js
*/

用法

/*  default.json */
{
  "HTTP":  {
    "PORT": 3001,
    "MESSAGE": "Hello!"
  }
}
/*  development.json */
{
  "HTTP":  {
    "PORT": 4001
  }
}
/* app.js */
const config = require('config');

const message = config.get('HTTP.MESSAGE');
// "Hello!" (from default.json)

const port = config.get('HTTP.PORT');
// 4001 (from development.json, overrides 3001)
/* Windows */
set NODE_ENV=development& app.js

/* Linux */
NODE_ENV=development app.js

/* cross-platform */
cross-env NODE_ENV=development app.js

【讨论】:

    【解决方案2】:

    dotenv是node.js中管理环境变量的常用方案。

    您可以为您需要的每个环境定义一个.env 文件。然后以node environment variables 访问它们。

    根据您的用例,您可以使用环境变量来填充您的 config.json,或者您可能根本不需要配置文件,可以直接使用环境变量。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您希望在 Node.js 应用程序中使用 Windows 环境变量,以便这些值来自主机操作系统/环境本身,而不是硬编码在配置文件中,这是一个正常的 CICD 要求。 Windows 环境变量将在默认安装 Node.js 的任何地方可用。您不需要任何额外的软件包。系统和用户环境变量都将在 Node.js 进程环境 process.env.whatever 中可用。例如:

      const setting1 = process.env.setting1
      const setting2 = process.env.setting2
      

      但是,正如@max-starling 所说,您不能在 .json 文件中使用它们,因为它们是静态文件。在这种情况下,我认为 JavaScript 配置文件更有意义。

      主app.js

      import config from './config'
      console.log(config.setting1)
      

      config.js

      const somesetting = {
        setting1: process.env.setting1,
        setting2: process.env.setting2
      }
      module.exports = somesetting; 
      

      节点文档:https://nodejs.org/api/process.html#process_process_env

      【讨论】:

        猜你喜欢
        • 2015-07-18
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-07
        • 2013-12-22
        • 2021-01-26
        相关资源
        最近更新 更多