30

¿Cuál es el método más fácil para que Express sepa en qué entorno estoy? P.ej. 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?Node.js, express y usando desarrollo versus producción en la app.configure

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

Respuesta

26

Su enfoque está bien, pero se puede hacer algo más genérico, como el almacenamiento de los datos de configuración para Redis en un archivo o pasar el host y el puerto como argumentos:

node app.js REDIS_HOST REDIS_PORT

Luego, en su aplicación puede apoderarse de ellos 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 }); 
}); 

actualización:

Express saber en qué entorno que está en examinado la variable NODE_ENV (process.env.NODE_ENV): https://github.com/visionmedia/express/blob/master/lib/application.js#L55

Puede establecer esa variable cuando se inicia la aplicación de este modo: NODE_ENV=production node app.js, proceso de fijación (recomendado) .env.NODE_ENV manualmente en su aplicación de nodo antes del código Express o poniendo ese env var en ~/.profile como dijo Ricardo.

+0

Puede ir más allá definiendo los valores predeterminados para esos parámetros en su archivo package.json u otro archivo de configuración. –

17

acaba de establecer la variable NODE_ENV entorno para production o development, como se ve en docs expresó: http://expressjs.com/guide.html#configuration

simplemente dejo NODE_ENV=development en ~/.profile (.bashrc o .bash_profile en Linux) de la máquina dev, y lo mismo por production unos.

+6

Solo un aviso. El enlace que publicaste ahora está roto. Creo que eqivelant es http://expressjs.com/api.html#app.establecer – ChristopherStrydom

+0

O posiblemente: http://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production – tgf

9

hice somthing aún más completa, ordenando las fuentes de tales 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 manera puede utilizar argumentos de línea de comandos, la configuración de env y valores por defecto.

+1

Con su técnica anterior, a menos que realice 'process.env.NODE_ENV = process .argv [2] 'al pasar un parametro env en la línea de comando, Express seguirá pensando en el modo process.env.NODE_ENV (dev por defecto). – alessioalex

+0

Es cierto. Puede que tenga que cambiar eso. Gracias por tu observación –

+1

Reemplazando 'var env =' con 'var env = process.env.NODE_ENV =' trabajado para mí. –

24

Para ampliar la idea de utilizar 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} 
    } 
} 

carga el archivo de configuración y el interruptor basan en 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 el NODE_ENV se encuentra en cada servidor (ver otras respuestas, de una manera: NODE_ENV=production node app.js), y de esta manera la variable de configuración tiene la configuración apropiada para el servidor que se ejecuta.

0

Uso del módulo de configuración que permite crear múltiples archivos de configuración https://www.npmjs.com/package/config

Ej default.json, production.json

y comenzar su servidor con

exportación establecido NODE_ENV = producción & inicio & NPM

Cuestiones relacionadas