web-dev-qa-db-fra.com

Node.js, express et utilisation du développement par rapport à la production dans app.configure

Quelle est la méthode la plus simple pour faire savoir à quel environnement je me trouve? Par exemple. Je veux faire ce qui suit pour établir une connexion à redis en fonction de mon environnement. Cela peut-il être fait à partir de la ligne de commande?

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

Votre approche est correcte, mais vous pouvez créer quelque chose de plus générique, comme stocker les données de configuration pour Redis dans un fichier ou passer les arguments de type hôte et port:

node app.js REDIS_Host REDIS_PORT

Ensuite, dans votre application, vous pouvez les récupérer en utilisant 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 });
});

Mise à jour:

Express saura dans quel environnement vous vous trouvez en regardant la variable NODE_ENV (process.env.NODE_ENV): https://github.com/visionmedia/express/blob/master/lib/application.js# L55

Vous pouvez définir cette variable lors du démarrage de l'application comme suit: NODE_ENV=production node app.js (recommandé), en définissant manuellement process.env.NODE_ENV dans votre application de nœud avant le code Express ou en mettant cette variable env dans ~/.profile comme Ricardo l'a dit.

28
alessioalex

Pour développer l'idée d'utiliser un fichier config.json:

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

Chargez le fichier de configuration et basculez en fonction de 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);

Assurez-vous que NODE_ENV est défini sur chaque serveur (voir les autres réponses, dans un sens: NODE_ENV=production node app.js), et ainsi la variable config a les paramètres appropriés au serveur sur lequel elle s'exécute.

24
Sean

Réglez simplement le NODE_ENV variable d'environnement à production ou development, comme vu dans les documents express: http://expressjs.com/guide.html#configuration

Je laisse juste NODE_ENV=development dans la machine de développement ~/.profile (.bashrc ou bash_profile sur linux), et faites de même pour les production ceux.

17
Ricardo Tomasi

J'ai fait quelque chose d'encore plus complet en ordonnant les sources de ces paramètres:

    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

De cette façon, vous pouvez utiliser les arguments de ligne de commande, les paramètres env et les valeurs par défaut.

9
Arnaud Rinquin

Utilisez le module de configuration qui permet de créer plusieurs fichiers de configuration https://www.npmjs.com/package/config

Par exemple default.json, production.json

Et démarrez votre serveur avec

jeu d'export NODE_ENV = production && npm start

0
Ashutosh Jha