我一直在开发一些Node应用程序,我一直在寻找一种存储部署相关设置的良好模式。在Django世界(我来自那里),常见的做法是有一个settings.py文件包含标准设置(时区等),然后有一个local_settings.py用于部署特定的设置,即。要与什么数据库通信、什么memcache套接字、管理员的电子邮件地址等等。
我一直在为Node寻找类似的模式。只要一个配置文件就好了,这样它就不必与app.js中的其他所有东西挤在一起,但我发现有一种方法在源代码控制之外的文件中拥有特定于服务器的配置很重要。同一款应用可以部署在不同设置的服务器上,必须处理合并冲突,这不是我的乐趣所在。
那么是否存在某种框架/工具,或者每个人都只是自己拼凑一些东西?
尝试使用properties-gen
https://www.npmjs.com/package/properties-gen
node-config与node-config非常相似,后者加载配置基础文件,并根据所设置的环境使用ext文件对其进行扩展,但这是一个按需运行且完全可配置的cli。
npx properties-gen init
要创建cli配置,然后将其安装到项目中
npm install properties-gen --save-dev
定义您的配置文件(基本和扩展),并在构建过程之前或在项目中启动开发服务器之前运行generate命令。
{
"name": "myApp",
"scripts": {
"config": "properties-gen generate",
"dev": "npm run config && next dev",
"build": "npm run config && next build",
"start": "next start"
}
}
一件很酷的事情是,您可以定义多个配置组,以防您需要生成多个输出,例如特定于客户端和服务器的文件。
我使用Dotenv-Flow进行配置管理。
这和预期的一样。通常情况下你会有多个
本地、开发、登台和生产等环境。看这些
步骤创建您自己的环境。
1. 我喜欢流动。
2. 创建像.env | .env.dev | .env.prod这样的文件。
出于测试目的,复制此内容
.env
DATABASE_HOST=global
DATABASE_PORT=global
DATABASE_USER=global
DATABASE_PASS=global
DATABASE_NAME=global
.env.dev
DATABASE_NAME=dev
DATABASE_PASS=dev
.env.prod
DATABASE_NAME=prod
DATABASE_PASS=prod
现在使用这些环境变量创建一个测试文件。
. js
console.log('database host:', process.env.DATABASE_HOST);
console.log('database port:', process.env.DATABASE_PORT);
console.log('database user:', process.env.DATABASE_USER);
console.log('database pass:', process.env.DATABASE_PASS);
console.log('database name:', process.env.DATABASE_NAME);
现在使用这些命令运行脚本。
node -r dotenv-flow/config test.js
node -r dotenv-flow/config test.js --node-env=dev
node -r dotenv-flow/config test.js --node-env=prod
如果您在特定的文件夹中创建这些环境变量文件,就像我在envs文件夹中创建这些文件一样,那么使用下面的命令。
node -r dotenv-flow/config test.js --dotenv-flow-path=./envs
node -r dotenv-flow/config test.js --dotenv-flow-path=./envs --node-env=dev
node -r dotenv-flow/config test.js --dotenv-flow-path=./envs --node-env=prod
我用一个包装。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中,并为我的生产服务器添加了遥控器。
只需使用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
我将创建一个文件夹,配置一个命名为config.js的文件,稍后我会在需要的地方使用这个文件,如下所示
config.js的例子
module.exports = {
proxyURL: 'http://url:port',
TWITTER: {
consumerkey: 'yourconsumerkey',
consumerSecrete: 'yourconsumersecrete'
},
GOOGLE: {
consumerkey: 'yourconsumerkey',
consumerSecrete: 'yourconsumersecrete'
},
FACEBOOK: {
consumerkey: 'yourconsumerkey',
consumerSecrete: 'yourconsumersecrete'
}
}
然后,如果我想在某处使用这个配置文件
我将首先导入如下
Var config = require('./config');
,我可以访问如下的值
const oauth = OAuth({
consumer: {
key: config.TWITTER.consumerkey,
secret: config.TWITTER.consumerSecrete
},
signature_method: 'HMAC-SHA1',
hash_function(base_string, key) {
return crypto.createHmac('sha1', key).update(base_string).digest('base64');
}
});