run - Node.js, express y usando desarrollo versus producción en app.configure
run node app in production (5)
¿Cuál es el método más fácil para dejar saber en qué entorno estoy? Por ejemplo, quiero hacer lo siguiente para hacer una conexión a redis dependiendo de en qué env estoy. ¿Se puede hacer esto desde la línea de comando?
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 });
});
Hice algo aún más completo al ordenar las fuentes de dichos parámetros:
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 esta forma puede usar argumentos de línea de comando, configuraciones env y valores predeterminados.
Para ampliar la idea de usar un archivo 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}
}
}
Cargue el archivo de configuración y cambie según 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);
Asegúrese de que NODE_ENV esté configurado en cada servidor (vea otras respuestas, una vía: NODE_ENV=production node app.js
), y de esta manera la variable de configuración tiene la configuración adecuada para el servidor en el que se ejecuta.
Simplemente configure la variable de entorno NODE_ENV
para production
o development
, como se ve en express ''docs: http://expressjs.com/guide.html#configuration
Simplemente dejo NODE_ENV=development
en ~/.profile
(.bashrc o bash_profile en linux) de la máquina de NODE_ENV=development
, y hago lo mismo para los de production
.
Su enfoque está bien, pero puede hacer algo más genérico, como almacenar los datos de configuración para Redis en un archivo o pasar los argumentos de host y puerto como:
node app.js REDIS_HOST REDIS_PORT
Luego, en su aplicación, puede tomarlos usando 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 });
});
Actualizar:
Express sabrá en qué entorno se encuentra al observar la variable NODE_ENV (process.env.NODE_ENV): https://github.com/visionmedia/express/blob/master/lib/application.js#L55
Puede establecer esa variable al iniciar la aplicación de la siguiente manera: NODE_ENV=production node app.js
(recomendado), estableciendo process.env.NODE_ENV manualmente en su aplicación de nodo antes del código Express o poniendo esa env var en ~ / .profile como Ricardo dijo.
Use el módulo de configuración que permite crear múltiples archivos de configuración https://www.npmjs.com/package/config
Por ejemplo, default.json, production.json
Y enciende tu servidor
conjunto de exportación NODE_ENV = producción && npm start