Node.js setting up environment specific configs to be used with everyauth Node.js setting up environment specific configs to be used with everyauth node.js node.js

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.