This modules allows you to easily manage the configuration of small and big applications with environment variable and multi environment support
NPM has you covered: npm i -S confim
Example configuration file config.js
module.exports = {
modules: {
database: {
default: {
port: 1234
},
development: {
host: 'database.dev.internal'
},
integration: {
host: 'database.int.internal'
},
production: {
host: 'database.prod.internal'
}
}
},
shared: {
default: {
loglevel: "info"
},
"development": {
"loglevel": "debug"
},
"integration": {
"loglevel": "error"
},
"production": {
"loglevel": "warn"
}
},
aliases: {
'primary-server': "web-server-two"
}
};
"shared": {
"*": {
"loglevel": "info"
},
"development": {
"loglevel": "debug"
},
"integration": {
"loglevel": "error"
},
"production": {
"loglevel": "warn"
}
},
"modules": {
"web-server-one": {
"*": {
"port": 3000,
"host": "127.0.0.1"
},
"development": {
"host": "0.0.0.0"
}
},
"web-server-two": {
"*": {
"port": 4000,
"host": "127.0.0.1"
},
"development": {
"host": "0.0.0.0"
}
},
"database": {
"*": {
"loglevel": "info",
"username": "foo",
"database": "bar",
"password": "___CONFIM___REQUIRED___"
},
"development": {
"host": "localhost",
"password": "weakPassFoLocal"
},
"integration": {
"host": "db.integration.example.org"
},
"production": {
"host": "db.production.example.org"
}
}
}
}
- three modules:
web-server-one
web-server-two
(notice we definedloglevel
which overrides the shared property)database
- a shared
loglevel
property accessible to every module - an alias for
web-server-two
namedprimary-server
The default
key in the modules and in the shared key is the default to use for any environment where the key is not defined.
We use a special __CONFIM_REQUIRED__
key in database module. This makes sure that the value is present as environment variable or in a specific environment.
In the example password
is defined in development unlike integration and production. When you do not provide it via env DATABASE_password=bla
and the environment is not development the app will fail as soon as the configuration is read from file
Create a ìndex.js
file in the same directory or a child directory of the config.js file and paste the following content.
// file: index.js
var Confim = require('confim').default; // import confim using es5
//import Confim from 'confim'; // import confim using es6
// Get database config merged with shared and of current environment
var dbConf = Confim('database').conf;
console.log(dbConf);
The only thing left to do before you run is install confim: npm i -S confim
Now try running the example: node index.js
; When you try to run it in the production environment it will throw an error as the database password is not set: env NODE_ENV=production node index.js
; This can be fixed by supplying the variable: env NODE_ENV=production DATABASE_password=yay! node index.js
Just create an issue on GitHub and I will see what I can do...
- Nicer error handling
- Translate keys to multi-level objects