30

Qual è il metodo più semplice per consentire a express di sapere in quale ambiente si trova? Per esempio. Voglio fare quanto segue per stabilire una connessione con i redis a seconda di quale ambiente sono. Può essere fatto dalla riga di comando?Node.js, express e utilizzo dello sviluppo rispetto alla produzione in 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 }); 
}); 

risposta

26

Il tuo approccio è ok, ma si può fare qualcosa di più generico, come la memorizzazione dei dati di configurazione per Redis in un file o passando l'host e la porta come argomenti:

node app.js REDIS_HOST REDIS_PORT

Poi, nel la vostra applicazione si può afferrare utilizzando 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 }); 
}); 

Aggiornamento:

Express sapere in quale ambiente si è in, cercando in variabile NODE_ENV (process.env.NODE_ENV): https://github.com/visionmedia/express/blob/master/lib/application.js#L55

È possibile impostare questa variabile quando si avvia l'applicazione in questo modo: NODE_ENV=production node app.js (consigliato), processo di definizione .env.NODE_ENV manualmente nella tua app nodo prima del codice Express o mettendo quell'env var in ~/.profile come ha detto Ricardo.

+0

È possibile andare oltre definendo i valori predefiniti per tali parametri nel file package.json o in un altro file di configurazione. –

17

Basta impostare la variabile NODE_ENV ambiente production o development, come si vede in docs Express': http://expressjs.com/guide.html#configuration

Ho appena lascio NODE_ENV=development nella macchina dev ~/.profile (.bashrc o .bash_profile su linux), e fare lo stesso per production quelli.

+6

Solo un testa a testa. Il link che hai postato è ora rotto. Credo che l'eqivelant sia http://expressjs.com/api.html#app.imposta – ChristopherStrydom

+0

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

9

ho fatto somthing ancora più completa, ordinando le fonti di tali parametri:

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 

In questo modo è possibile utilizzare argomenti della riga di comando, le impostazioni env e valori di default.

+1

Con la tua tecnica di sopra, a meno che tu non esegua manualmente il processo process.env.NODE_ENV = .argv [2] 'quando si passa un parametro env sulla riga di comando, Express continuerà a pensare in modalità process.env.NODE_ENV (dev per impostazione predefinita). – alessioalex

+0

Vero. Potrei doverlo cambiare. Grazie per la tua osservazione –

+1

Sostituire 'var env =' con 'var env = process.env.NODE_ENV =' ha funzionato per me. –

24

per espandere l'idea di utilizzare un file 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} 
    } 
} 

Caricare il file di configurazione e l'interruttore basano su 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); 

Accertarsi che il NODE_ENV sia impostato su ogni server (vedi altre risposte, in un modo: NODE_ENV=production node app.js), e in questo modo la variabile di configurazione ha le impostazioni appropriate per il server che gira su.

0

Usa modulo di configurazione che permette di creare più file di configurazione https://www.npmjs.com/package/config

Eg default.json, production.json

E avviare il server con

export set NODE_ENV = produzione & inizio & NPM

Problemi correlati