Node.js, express, and using development versus production in app.configure

后端 未结 5 1473
孤城傲影
孤城傲影 2020-12-07 14:44

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

相关标签:
5条回答
  • 2020-12-07 15:37

    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

    0 讨论(0)
  • 2020-12-07 15:44

    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.

    0 讨论(0)
  • 2020-12-07 15:45

    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.

    0 讨论(0)
  • 2020-12-07 15:48

    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.

    0 讨论(0)
  • 2020-12-07 15:48

    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.

    0 讨论(0)
提交回复
热议问题