首页 > 解决方案 > 在 nodejs 中管理配置以从文件和环境变量中获取变量

问题描述

我有一个配置文件,其中存储了密码并使用了数据

'use strict';

export default {
    dbProd: {
        connectionString: 'postgres://...',
    },
    dbDev: {
        connectionString: 'postgres://...',
    },
    ...
}

我还有一个postgresql数据库连接文件

'use strict';

import { Pool } from 'pg';
import config from './../config';

export default new Pool({
    connectionString: config.dbDev.connectionString,
    ssl: true
});

在我的package.json文件中,有三个脚本。第一个启动项目,第二个开发,第三个生产

  "scripts": {
    "start": "nodemon --exec babel-node src/index.js",
    "devbuild": "babel src --out-dir dev-backend",
    "build": "babel src --out-dir backend"
  },

当我收集一个用于生产的项目以通过 连接到数据库时dbProd,如果开发转移到dbDev. 如何实施?

标签: node.js

解决方案


您应该考虑使用 node-package config NPM Config,因为它使这些事情变得更加容易。

您只需要在文件夹中创建一个default.json文件/config,该文件将包括您的所有开发配置和在开发或生产中都不会更改的配置。您必须创建的第二个文件将是一个production.json包含所有生产配置的文件,这些配置会覆盖默认键:值。

在您package.json的环境中,您只需要一个用于生产环境的启动脚本和一个用于开发的启动脚本。这可能看起来像这样:

 "start": "SET NODE_ENV=production& node ./bin/www",
 "dev": "node ./bin/www",

通过设置NODE_ENV=production配置模块将加载默认配置并查看生产文件内部以找出在生产模式下必须覆盖哪些值。

一个简单的例子default config file

{
    "Services": {
      "api": {
        "username": "user",
        "password": "password",
        "base_url": "https://development.com/test"
      }
    },
    "Network": {
      "proxy": {
        "host": "http://myproxy/",
        "port": 80
      }
    }
  }

如果代理始终相同并且只是 API 更改,production file则将如下所示:

  {
    "Services": {
      "api": {
        "username": "prodUser",
        "password": "prodPassword",
        "base_url": "https://production.com/test"
      }
    }
  }

现在可以在您的代码中使用它,例如:

const config = require('config');
const serviceConfig = config.get('Services');
const networkConfig = config.get('Network');

networkConfig.get('proxy.host')+":"+networkConfig.get('proxy.port')

推荐阅读