wake-up-neo.com

Node.js, Express und Verwendung von Entwicklung versus Produktion in app.configure

Was ist die einfachste Methode, um mitzuteilen, in welcher Umgebung ich mich befinde? Z.B. Ich möchte Folgendes tun, um eine Verbindung zu Redis herzustellen, je nachdem, in welcher Umgebung ich mich befinde. Kann dies über die Befehlszeile erfolgen?

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 });
});
31
Tampa

Ihr Ansatz ist in Ordnung, aber Sie können etwas allgemeineres festlegen, z. B. das Speichern der Konfigurationsdaten für Redis in einer Datei oder das Übergeben der Argumente für Host und Port:

node app.js REDIS_Host REDIS_PORT

Dann können Sie sie in Ihrer App mit process.argv abrufen:

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 });
});

Aktualisieren:

Express erkennt anhand der Variablen NODE_ENV (process.env.NODE_ENV), in welcher Umgebung Sie sich befinden: https://github.com/visionmedia/express/blob/master/lib/application.js# L55

Sie können diese Variable beim Starten der App wie folgt festlegen: NODE_ENV=production node app.js (empfohlen), setze process.env.NODE_ENV manuell in deiner Node-App vor dem Express-Code oder setze diese env var in ~/.profile, wie Ricardo sagte.

28
alessioalex

So erweitern Sie die Idee, eine config.json-Datei zu verwenden:

// 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}
  }
}

Laden Sie die Konfigurationsdatei und wechseln Sie basierend auf 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);

Stellen Sie sicher, dass NODE_ENV auf jedem Server festgelegt ist (siehe andere Antworten, eine Möglichkeit: NODE_ENV=production node app.js), und auf diese Weise weist die Konfigurationsvariable die Einstellungen auf, die dem Server entsprechen, auf dem sie ausgeführt wird.

24
Sean

Setzen Sie einfach die Umgebungsvariable NODE_ENV Auf production oder development, wie in den Expressdokumenten beschrieben: http://expressjs.com/guide.html#configuration)

Ich lasse einfach NODE_ENV=development Im ~/.profile Der Dev-Maschine (.bashrc oder bash_profile unter Linux) und mache dasselbe für production.

17
Ricardo Tomasi

Ich habe etwas noch umfassenderes getan, indem ich die Quellen für solche Parameter bestellt habe:

    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

Auf diese Weise können Sie Befehlszeilenargumente, Env-Einstellungen und Standardwerte verwenden.

9
Arnaud Rinquin

Verwenden Sie das Konfigurationsmodul, mit dem Sie mehrere Konfigurationsdateien erstellen können https://www.npmjs.com/package/config

ZB default.json, production.json

Und starten Sie Ihren Server mit

export set NODE_ENV = Produktion & npm Start

0
Ashutosh Jha