协慌网

登录 贡献 社区

如何存储 Node.js 部署设置 / 配置文件?

我一直在研究一些 Node 应用程序,并且一直在寻找一种存储与部署相关的设置的良好模式。在 Django 世界(我来自哪里)中,通常的做法是先创建一个settings.py文件,其中包含标准设置(时区等),然后是一个local_settings.py用于部署特定设置,即。与哪个数据库进行通信,什么 Memcache 套接字,管理员的电子邮件地址等等。

我一直在寻找 Node 的类似模式。只需一个配置文件就可以了,因此它不必与app.js其他所有文件一起使用,但是我发现,有一种方法可以在不在源代码管理中的文件中具有服务器特定的配置,这一点很重要。同一应用程序很可能会以完全不同的设置部署在不同的服务器上,并且不得不处理合并冲突,而这并不是我的乐趣所在。

那么,为此是否有某种框架 / 工具,或者每个人都只是自己一起破解一些东西?

答案

我将package.json用于我的软件包,将config.js用于我的配置,如下所示:

var config = {};

config.twitter = {};
config.redis = {};
config.web = {};

config.default_stuff =  ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password=  process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;

module.exports = config;

我从我的项目中加载配置:

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

config.db_hostconfig.db_port等访问我的东西。如果我不想在源代码管理中存储密码,则可以使用硬编码的参数,也可以使用存储在环境变量中的参数。

我还生成一个package.json并插入一个依赖项部分:

"dependencies": {
  "cradle": "0.5.5",
  "jade": "0.10.4",
  "redis": "0.5.11",
  "socket.io": "0.6.16",
  "twitter-node": "0.0.2",
  "express": "2.2.0"
}

将项目克隆到本地计算机时,我运行npm install来安装软件包。有关此的更多信息。

该项目存储在 GitHub 中,并为我的生产服务器添加了遥控器。

您可以从 Node v0.5.x 开始要求 JSON 文件(引用此答案

config.json:

{
    "username" : "root",
    "password" : "foot"
}

app.js:

var config = require('./config.json');
log_in(config.username, config.password);

后来,我找到了一个很好的用于管理配置的 Node.js 模块: nconf

一个简单的例子:

var nconf = require('nconf');

// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();

// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });

// Provide default values for settings not provided above.
nconf.defaults({
    'http': {
        'port': 1337
    }
});

// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));

它还支持将设置存储在Redis 中,编写配置文件,并且具有相当可靠的 API,并且作为 Flatiron框架计划的一部分,还得到了备受推崇的 Node.js 商店之一 Nodejitsu 的支持。相当适合未来。

在 Github 上查看 nconf。