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

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

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


当前回答

你们使用npm来启动你的脚本(env等)吗?

如果你使用.env文件,你可以将它们包含在package.json中 并使用NPM来源/启动它们。

例子:

{
  "name": "server",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node test.js",
    "start-dev": "source dev.env; node test.js",
    "start-prod": "source prod.env; node test.js"
  },
  "dependencies": {
    "mysql": "*"
  }
}

然后运行NPM脚本:

$ npm start-dev

描述在这里https://gist.github.com/ericelliott/4152984 这都要归功于埃里克·埃利奥特

其他回答

只需要用exports做一个简单的settings.js:

exports.my_password = 'value'

然后,在你的脚本中,执行require:

var settings = require('./settings.js');

所有的设置现在将可用的设置变量:

settings.my_password // 'value'

我只是使用了一个alt示例,因为我想要比典型的.json文件更灵活,但不希望它被抽象到一个需要依赖的库中,就像这样。基本上,导出一个立即调用的函数,该函数返回一个带有我想要设置的值的对象。有很大的灵活性。

     module.exports = function(){
       switch(node_env){
         case 'dev':
           return
           { var1 = 'development'};
         }
    }();

这里有一个更好的解释和完整的例子。使用Node.js中的配置文件

另一个选项是为验证添加模式。像nconf一样,它支持从环境变量、参数、文件和json对象的任何组合中加载设置。

来自README的例子:

var convict = require('convict');
var conf = convict({
  env: {
    doc: "The applicaton environment.",
    format: ["production", "development", "test"],
    default: "development",
    env: "NODE_ENV"
  },
  ip: {
    doc: "The IP address to bind.",
    format: "ipaddress",
    default: "127.0.0.1",
    env: "IP_ADDRESS",
  },
  port: {
    doc: "The port to bind.",
    format: "port",
    default: 0,
    env: "PORT"
  }
});

入门文章: 用节点罪犯驯服构型

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

你存储你的配置在纯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

我知道这是一个非常老的帖子。但是我想分享我的配置环境变量的模块,我认为这是一个非常灵活的解决方案。 下面是模块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来获取环境的所有变量。