我一直在开发一些Node应用程序,我一直在寻找一种存储部署相关设置的良好模式。在Django世界(我来自那里),常见的做法是有一个settings.py文件包含标准设置(时区等),然后有一个local_settings.py用于部署特定的设置,即。要与什么数据库通信、什么memcache套接字、管理员的电子邮件地址等等。

我一直在为Node寻找类似的模式。只要一个配置文件就好了,这样它就不必与app.js中的其他所有东西挤在一起,但我发现有一种方法在源代码控制之外的文件中拥有特定于服务器的配置很重要。同一款应用可以部署在不同设置的服务器上,必须处理合并冲突,这不是我的乐趣所在。

那么是否存在某种框架/工具,或者每个人都只是自己拼凑一些东西?


当前回答

我知道这是一个非常老的帖子。但是我想分享我的配置环境变量的模块,我认为这是一个非常灵活的解决方案。 下面是模块json-configurator

var configJson = {
  'baseUrl': 'http://test.com',
  '$prod_baseUrl': 'https://prod.com',
  'endpoints': {
    'users': '<%= baseUrl %>/users',
    'accounts': '<%= baseUrl %>/accounts'
    },
  foo: 'bar',
  foobar: 'foobar',
  $prod_foo: 'foo in prod',
  $test_foo: 'foo in test',
  deep:{
    veryDeep: {
      publicKey: 'abc',
      secret: 'secret',
      $prod_secret: 'super secret'
    }
  }
};

var config = require('json-configurator')(configJson, 'prod');

console.log(config.deep.veryDeep.secret) 
// super secret 

console.log(config.endpoints.users)
// https://prod.com/users 

然后你可以使用process.env。NODE_ENV来获取环境的所有变量。

其他回答

最好将“开发”和“生产”配置分开。

我用以下方法: 这是我的config/index.js文件:

const config = {
    dev : {
        ip_address : '0.0.0.0',
        port : 8080,
        mongo :{
            url : "mongodb://localhost:27017/story_box_dev",
            options : ""
        }
    },
    prod : {
        ip_address : '0.0.0.0',
        port : 3000,
        mongo :{
            url : "mongodb://localhost:27017/story_box_prod",
            options : ""
        }
    }
} 

对于require配置使用如下:

const config = require('../config')[process.env.NODE_ENV];

然后你可以使用你的配置对象:

const ip_address = config.ip_address;
const port = config.port;

只需使用npm模块配置(超过300000次下载)

https://www.npmjs.com/package/config

节点配置为应用程序部署组织分层配置。

它允许您定义一组默认参数,并为不同的部署环境(开发、qa、登台、生产等)扩展它们。

$ npm install config
$ mkdir config
$ vi config/default.json


{
      // Customer module configs
      "Customer": {
        "dbConfig": {
          "host": "localhost",
          "port": 5984,
          "dbName": "customers"
        },
        "credit": {
          "initialLimit": 100,
          // Set low for development
          "initialDays": 1
        }
      }
}



$ vi config/production.json

{
  "Customer": {
    "dbConfig": {
      "host": "prod-db-server"
    },
    "credit": {
      "initialDays": 30
    }
  }
}



$ vi index.js

var config = require('config');
//...
var dbConfig = config.get('Customer.dbConfig');
db.connect(dbConfig, ...);

if (config.has('optionalFeature.detail')) {
  var detail = config.get('optionalFeature.detail');
  //...
}


$ export NODE_ENV=production
$ node index.js

对于那些正在访问这个旧线程的人来说,这里有一个我觉得不错的包。

https://www.npmjs.org/package/config

有点晚了(只有10年),但我使用的config.js结构如下:

const env = process.env.NODE_ENV || 'development';

var config_temp = {
    default:{
        port: 3000,
        mysql_host: "localhost",
        logging_level: 5,
        secret_api_key: process.env.SECRET_API_KEY
    },
    development: {
        logging_level: 10
    },
    production: {
        port: 3001,
        mysql_host: "not-localhost"
    }
};
var config = {
    ...config_temp.default, 
    ...config_temp[env]
}
module.exports = config;

然后我加载配置:

var config = require('./config');
var port = config.port;

这样:

env变量的读取包含在config.js文件中,因此我可以避免这种丑陋的情况:NODE_ENV || 'development']。 config.js文件可以在代码的repo中上传,因为敏感变量继续由process.env处理。 如果default:{和custom_env:{中都包含同一个元素,则只保留第二个元素。 没有专用文件夹和多个文件(像在配置中)

我在这里尝试了一些建议的解决方案,但对它们不满意,所以我创建了自己的模块。它被称为微配置,主要的区别是它尊重约定而不是配置,所以你可以只需要这个模块并开始使用它。

你存储你的配置在纯js,或json文件从/config文件夹。首先它加载default.js文件,然后是/config目录下的所有其他文件,然后它根据$NODE_ENV变量加载特定于环境的配置。

它还允许使用local.js或特定于环境的/config/env/$NODE_ENV.local.js覆盖本地开发的配置。

你可以在这里看看:

https://www.npmjs.com/package/mikro-config

https://github.com/B4nan/mikro-config