代码之家  ›  专栏  ›  技术社区  ›  Chubsdad

动态设置配置.json来自环境

  •  0
  • Chubsdad  · 技术社区  · 4 年前

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

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

    我的环境是Windows。

    编辑2: C:\xyz D:\xyz 等等,我不可能事先知道。所以这意味着我不能有一个静态的设置,即使我的环境是不同的。 谢谢

    2 回复  |  直到 4 年前
        1
  •  0
  •   j-petty    4 年前

    dotenv 是在中管理环境变量的通用解决方案节点.js.

    .env 为您需要的每个环境提供文件。然后作为 node environment variables .

        2
  •  0
  •   Max Starling    4 年前

    JSON是一个静态文件,其内容是一个字符串,因此不能在这里使用变量。

    您可以尝试使用javascript重写json文件 fs 模块 readFile writeFile .

    也许模板引擎像 Handlebars Mustache 会帮你更容易做到。

    但通常开发人员对一个环境使用一个静态文件。只能在启动应用程序之前更改配置,否则可能会在运行时中断配置(这对用户和客户非常不利)。

    看看这个 https://www.npmjs.com/package/config 我们使用这个软件包很多年了,它对一些环境非常好。

    基础设施

    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
    
        3
  •  0
  •   codebeard    4 年前

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

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

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

    主应用程序js

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

    配置文件

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

    https://nodejs.org/api/process.html#process_process_env