2012-05-22 14 views
29

In questo momento, ogni volta che voglio distribuire un server node.js al mio server di produzione, devo cambiare tutti gli IP/DNS/nome utente/password per la mia connessione a i miei database e le API esterne.Verifica se l'istanza node.js è dev o produzione

Questo processo è fastidioso, c'è un modo per verificare se l'istanza node.js attualmente in esecuzione si trova in cloud9ide o in realtà la mia smartmachine di produzione gioiosa?

Se riesco a detemrinare (nel mio codice di esecuzione) su quale server è in esecuzione l'istanza node.js, aggiungerò una condizione che imposta i valori sul prod o dev.

Grazie

+0

L'app node.js è un server HTTP? –

+0

Sì, lo è. Ha anche una connessione a mongodb. – guiomie

risposta

44

Normalmente si dovrebbe eseguire un'applicazione nodo nella produzione in questo modo:

NODE_ENV=production node app.js

Applicazioni con espresso, Socket.IO e altro uso process.env.NODE_ENV di capire l'ambiente.

In fase di sviluppo è possibile omettere questo e basta eseguire normalmente l'app con node app.js.

È possibile rilevare l'ambiente nel codice come questo:

var env = process.env.NODE_ENV || 'dev'; 
loadConfigFile(env + '.json', doStuff); 

Risorse:

How do you detect the environment in an express.js app?

+3

In Express 3.xe 4.x, la variabile env è impostata da express stesso [qui] (https://github.com/visionmedia/express/blob/master/lib/application.js#L52) allo 'sviluppo '. – Ryley

9

Penso che il modo più semplice per impostare l'ambiente è quello di passare argomento della riga di comando per l'applicazione.

node ./server.js dev 

Nello script è necessario gestire questo argomento e impostare la configurazione per ciò che è necessario.

var env = process.argv[2] || 'dev'; 
switch (env) { 
    case 'dev': 
     // Setup development config 
     break; 
    case 'prod': 
     // Setup production config 
     break; 
} 

Inoltre, sono stato creato module che rende il processo di configurazione un po 'più facile. Forse ti aiuterà.

+1

+1 Ciò consente di creare più configurazioni, da dev a stage a produzione. –

2

In realtà, io non consiglierei di memorizzare i valori di configurazione come le informazioni di connessione al database, le password, i token di accesso e l'interno del codice effettivo dell'applicazione per i seguenti motivi:

  1. La codifica hard di quei valori rende difficile cambiarli in seguito. Dovrai rilasciare una nuova versione dell'applicazione per modificare tali valori.

  2. Si tratta di una violazione grave della sicurezza, poiché i dati di configurazione e le password di livello produttivo non devono essere memorizzati nel codice. È molto facile perdere questi dati sensibili.

L'approccio migliore sarebbe esternalizzare questi dati e passarli all'applicazione durante l'esecuzione. Questo è normalmente fatto per mezzo di variabili di ambiente. Hai solo bisogno di definire una variabile d'ambiente unica per ogni pace di dati che deve essere variabile tra diversi ambienti.

Ad esempio: DB_HOST, DB_USER, DB_PASSWORD.Poi si potrebbe passare questi valori a voi applicazione in produzione questo modo:

$ NODE_ENV=production DB_HOST=1.2.3.4 DB_USER=someusername DB_PASSWORD=somerandompassword /bin/node app.js 

In realtà, questi valori potrebbero essere criptati e aggiunti alla base di codice e poi decifrati durante la distribuzione. Tuttavia, assicurarsi che la chiave di decodifica sia archiviata in modo sicuro nel sistema di distribuzione o fornita in modo interattivo dal tecnico di rilascio. Shippable allows to do this fuori dalla scatola.

Nell'ambiente di sviluppo diventa più semplice, perché si può usare molto conveniente dotenv module. Basta creare un file .env nella directory principale del progetto e aggiungere tutte le variabili ad essa:

DB_HOST=1.2.3.4 
DB_USER=someusername 
DB_PASSWORD=somerandompassword 

Ma, assicurarsi di escludere da voi VCS, perché ogni sviluppatore probabilmente vorrebbe avere configurazione personale. È possibile creare un file .env.dist per contenere la configurazione predefinita, che in seguito potrebbe essere utilizzata come modello: cp .env.dist .env.


Inoltre, ho implementato un modulo riutilizzabile, che permette di rilevare automaticamente l'ambiente analizzando entrambi gli argomenti CLI e variabili NODE_ENV. Questo potrebbe essere utile sul tuo computer di sviluppo, perché puoi facilmente cambiare ambiente passando un argomento CLI al tuo programma Node.js in questo modo: $ node app.js --prod. È anche piacevole da usare con Gulp: $ gulp build --prod.

Si prega di vedere i dettagli e casi d'uso sul detect-environment's page.