Reputation: 78352
What is the easiest method to let express know what environment I am in? E.g. I want do do the below to make a connection to redis depending on what env I am in. Can this be done from the command line?
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
var r = require("redis").createClient(6379,'127.0.0.1');
});
app.configure('production', function(){
app.use(express.errorHandler());
r = redis.createClient(6379,'46.137.195.230', { detect_buffers: true });
});
Upvotes: 34
Views: 60762
Reputation: 16367
Use config module that allows to create multiple config files https://www.npmjs.com/package/config
Eg default.json , production.json
And start your server wIth
export set NODE_ENV=production && npm start
Upvotes: 0
Reputation: 15961
To expand on the idea of using a config.json file:
// config.json
{
"development": {
"redisPort": 6379,
"redisHost": "127.0.0.1",
"errorHandlerOptions": {"dumpExceptions": true, "showStack": true}
},
"production": {
"redisPort": 6379,
"redisHost": "46.137.195.230",
"errorHandlerOptions": {"dumpExceptions": false, "showStack": false}
}
}
Load the config file and switch based on env.
// app.js
var config = require('./config.json')[app.get('env')];
app.use(express.errorHandler(config.errorHandlerOptions));
var r = require("redis").createClient(config.redisPort,config.redisHost);
Make sure the NODE_ENV is set on each server (see other answers, one way: NODE_ENV=production node app.js
), and this way the config variable has the settings appropriate to the server it runs on.
Upvotes: 27
Reputation: 35263
Just set the NODE_ENV
environment variable to production
or development
, as seen in express' docs: http://expressjs.com/guide.html#configuration
I just leave NODE_ENV=development
in the dev machine's ~/.profile
(.bashrc or bash_profile on linux), and do the same for production
ones.
Upvotes: 19
Reputation: 63683
Your approach is ok, but you can make something more generic, like storing the config data for Redis in a file or passing the host and port like arguments:
node app.js REDIS_HOST REDIS_PORT
Then in your app you can grab them using process.argv:
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
var r = require("redis").createClient(process.argv[2], process.argv[3]);
});
app.configure('production', function(){
app.use(express.errorHandler());
var r = require("redis").createClient(process.argv[2], process.argv[3], { detect_buffers: true });
});
Update:
Express will know in what environment you're in by looking at the NODE_ENV variable (process.env.NODE_ENV): https://github.com/visionmedia/express/blob/master/lib/application.js#L55
You can set that variable when starting the app like so: NODE_ENV=production node app.js
(recommended), setting process.env.NODE_ENV manually in your node app before the Express code or putting that env var in ~/.profile like Ricardo said.
Upvotes: 30
Reputation: 4306
I did somthing even more comprehensive by ordering the sources of such parameters :
var env = process.argv[2] || process.env.NODE_ENV || 'development'
var mongourl = process.argv[3] || process.env.NODE_DB || 'mongodb://localhost/default'
var port = process.env.PORT || 9001
This way you can use command line args, env settings and default values.
Upvotes: 9