Node.js setting up environment specific configs to be used with everyauth
My solution,
load the app using
NODE_ENV=production node app.js
Then setup config.js
as a function rather than an object
module.exports = function(){ switch(process.env.NODE_ENV){ case 'development': return {dev setting}; case 'production': return {prod settings}; default: return {error or other settings}; }};
Then as per Jans solution load the file and create a new instance which we could pass in a value if needed, in this case process.env.NODE_ENV
is global so not needed.
var Config = require('./conf'), conf = new Config();
Then we can access the config object properties exactly as before
conf.twitter.consumerKey
You could also have a JSON file with NODE_ENV as the top level. IMO, this is a better way to express configuration settings (as opposed to using a script that returns settings).
var config = require('./env.json')[process.env.NODE_ENV || 'development'];
Example for env.json:
{ "development": { "MONGO_URI": "mongodb://localhost/test", "MONGO_OPTIONS": { "db": { "safe": true } } }, "production": { "MONGO_URI": "mongodb://localhost/production", "MONGO_OPTIONS": { "db": { "safe": true } } }}
A very useful solution is use the config module.
after install the module:
$ npm install config
You could create a default.json configuration file. (you could use JSON or JS object using extension .json5 )
For example
$ vi config/default.json{ "name": "My App Name", "configPath": "/my/default/path", "port": 3000}
This default configuration could be override by environment config file or a local config file for a local develop environment:
production.json could be:
{ "configPath": "/my/production/path", "port": 8080}
development.json could be:
{ "configPath": "/my/development/path", "port": 8081}
In your local PC you could have a local.json that override all environment, or you could have a specific local configuration as local-production.json or local-development.json.
The full list of load order.
Inside your App
In your app you only need to require config and the needed attribute.
var conf = require('config'); // it loads the right filevar login = require('./lib/everyauthLogin', {configPath: conf.get('configPath'));
Load the App
load the app using:
NODE_ENV=production node app.js
or setting the correct environment with forever or pm2
Forever:
NODE_ENV=production forever [flags] start app.js [app_flags]
PM2 (via shell):
export NODE_ENV=stagingpm2 start app.js
PM2 (via .json):
process.json
{ "apps" : [{ "name": "My App", "script": "worker.js", "env": { "NODE_ENV": "development", }, "env_production" : { "NODE_ENV": "production" } }]}
And then
$ pm2 start process.json --env production
This solution is very clean and it makes easy set different config files for Production/Staging/Development environment and for local setting too.