我一直在开发一些Node应用程序,我一直在寻找一种存储部署相关设置的良好模式。在Django世界(我来自那里),常见的做法是有一个settings.py文件包含标准设置(时区等),然后有一个local_settings.py用于部署特定的设置,即。要与什么数据库通信、什么memcache套接字、管理员的电子邮件地址等等。
我一直在为Node寻找类似的模式。只要一个配置文件就好了,这样它就不必与app.js中的其他所有东西挤在一起,但我发现有一种方法在源代码控制之外的文件中拥有特定于服务器的配置很重要。同一款应用可以部署在不同设置的服务器上,必须处理合并冲突,这不是我的乐趣所在。
那么是否存在某种框架/工具,或者每个人都只是自己拼凑一些东西?
我的解决办法相当简单:
在./config/index.js中加载环境配置
var env = process.env.NODE_ENV || 'development'
, cfg = require('./config.'+env);
module.exports = cfg;
在./config/config.global.js中定义一些默认值
var config = module.exports = {};
config.env = 'development';
config.hostname = 'dev.example.com';
//mongo database
config.mongo = {};
config.mongo.uri = process.env.MONGO_URI || 'localhost';
config.mongo.db = 'example_dev';
重写。/config/config.test.js中的默认值
var config = require('./config.global');
config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';
module.exports = config;
在./models/user.js中使用:
var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
在测试环境中运行应用程序:
NODE_ENV=test 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"
}
}
一件很酷的事情是,您可以定义多个配置组,以防您需要生成多个输出,例如特定于客户端和服务器的文件。
你们使用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
这都要归功于埃里克·埃利奥特
有点晚了(只有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:{中都包含同一个元素,则只保留第二个元素。
没有专用文件夹和多个文件(像在配置中)