我一直在开发一些Node应用程序,我一直在寻找一种存储部署相关设置的良好模式。在Django世界(我来自那里),常见的做法是有一个settings.py文件包含标准设置(时区等),然后有一个local_settings.py用于部署特定的设置,即。要与什么数据库通信、什么memcache套接字、管理员的电子邮件地址等等。
我一直在为Node寻找类似的模式。只要一个配置文件就好了,这样它就不必与app.js中的其他所有东西挤在一起,但我发现有一种方法在源代码控制之外的文件中拥有特定于服务器的配置很重要。同一款应用可以部署在不同设置的服务器上,必须处理合并冲突,这不是我的乐趣所在。
那么是否存在某种框架/工具,或者每个人都只是自己拼凑一些东西?
有点晚了(只有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:{中都包含同一个元素,则只保留第二个元素。
没有专用文件夹和多个文件(像在配置中)
我用一个包装。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_host, config.db_port等访问我的东西…这让我可以使用硬编码的参数,如果我不想在源代码控制中存储密码,也可以使用存储在环境变量中的参数。
我还生成了一个包。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中,并为我的生产服务器添加了遥控器。
您可以将Konfig用于特定于环境的配置文件。它自动加载json或yaml配置文件,它有默认值和动态配置功能。
Konfig repo的一个例子:
File: config/app.json
----------------------------
{
"default": {
"port": 3000,
"cache_assets": true,
"secret_key": "7EHDWHD9W9UW9FBFB949394BWYFG8WE78F"
},
"development": {
"cache_assets": false
},
"test": {
"port": 3001
},
"staging": {
"port": #{process.env.PORT},
"secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
},
"production": {
"port": #{process.env.PORT},
"secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
}
}
在发展:
> config.app.port
3000
在生产环境中,假设我们使用$ NODE_ENV=生产PORT=4567节点app.js启动应用程序
> config.app.port
4567
详情:https://github.com/vngrs/konfig
下面是本文启发的一个简洁的方法。它不需要任何额外的包,除了无处不在的lodash包。此外,它还允许您使用特定于环境的覆盖来管理嵌套默认值。
首先,在包的根路径中创建一个配置文件夹,如下所示
package
|_config
|_ index.js
|_ defaults.json
|_ development.json
|_ test.json
|_ production.json
这是index.js文件
const _ = require("lodash");
const defaults = require("./defaults.json");
const envConf = require("./" + (process.env.NODE_ENV || "development") + ".json" );
module.exports = _.defaultsDeep(envConf, defaults);
现在我们假设有一个默认值。像这样的Json
{
"confKey1": "value1",
"confKey2": {
"confKey3": "value3",
"confKey4": "value4"
}
}
和发展。像这样的Json
{
"confKey2": {
"confKey3": "value10",
}
}
如果你执行config = require('./config'),你会得到这样的结果
{
"confKey1": "value1",
"confKey2": {
"confKey3": "value10",
"confKey4": "value4"
}
}
注意,除了在特定于环境的文件中定义的值外,您可以得到所有的默认值。因此,您可以管理配置层次结构。使用defaultsDeep可以确保您甚至可以拥有嵌套的默认值。