Che cos'è NODE_ENV e come utilizzarlo in Express?


184

Questa è la mia app, attualmente sto lavorando alla produzione.

var app = express();
app.set('views',settings.c.WEB_PATH + '/public/templates');
app.set('view engine','ejs');
app.configure(function(){
    app.use(express.favicon());
    app.use(express.static(settings.c.WEB_PATH + '/public'));
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.methodOverride());
    app.use(express.session({
            cookie:{ domain:"."+settings.c.SITE_DOMAIN, maxAge:1440009999},
            secret:'hamster',
            store: r_store,
            }));
    app.use(useragent.express());
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
});

Tuttavia, sono venuto a conoscenza NODE_ENVe voglio usarlo. Come posso fare questo?


Nel tuo caso presumo che ciò che è possibile utilizzare sia app.configure('development', ...)"produzione" per configurare determinate impostazioni solo per ambienti di sviluppo o produzione. Vedi expressjs.com/api.html#app.configure
Andreas Hultgren

Risposte:


360

NODE_ENVè una variabile d'ambiente resa popolare dal framework express webserver. Quando viene eseguita un'applicazione nodo, può verificare il valore della variabile d'ambiente e fare cose diverse in base al valore. NODE_ENVviene utilizzato specificamente (per convenzione) per stabilire se un determinato ambiente è un ambiente di produzione o di sviluppo . Un caso d'uso comune è l'esecuzione di codice di debug o di registrazione aggiuntivo se eseguito in un ambiente di sviluppo.

Accesso a NODE_ENV

È possibile utilizzare il codice seguente per accedere autonomamente alla variabile di ambiente in modo da poter eseguire i propri controlli e la propria logica:

var environment = process.env.NODE_ENV

O in alternativa usando express ' app.get('env')( nota: per impostazione predefinita è "development")

Tieni presente che se non hai impostato esplicitamente il NODE_ENVtuo ambiente, lo sarà undefined.

Impostazione di NODE_ENV

Come impostare effettivamente la variabile di ambiente varia da sistema operativo a sistema operativo e dipende anche dalla configurazione dell'utente.

Se vuoi impostare la variabile d'ambiente come una tantum, puoi farlo dalla riga di comando:

  • Linux e Mac :export NODE_ENV=production
  • windows :$env:NODE_ENV = 'production'

A lungo termine dovresti insistere affinché non si disattivi al riavvio - piuttosto che elencare tutti i possibili metodi per farlo, ti lascerò cercare come farlo da solo!

La convenzione ha dettato che ci sono solo due valori che dovresti usare per NODE_ENV, o productiono development, tutti in minuscolo. Non c'è nulla che ti impedisca di aggiungere altri valori, ma probabilmente non è una buona idea, poiché vedo molto di questo tipo di codice in molti dei node_modules che utilizzo:

var development = process.env.NODE_ENV !== 'production';

Si noti che si tratta di una pessima idea per cercare di set NODE_ENVda dentro un'applicazione nodo stesso - se lo si fa si applica solo al processo da cui è stato impostato , quindi le cose probabilmente non funzionano come ci si aspetta che. Non farlo - te ne pentirai.


5
In Express 4, app.configure()è stato rimosso. La guida alla migrazione di Express 4 consiglia di "utilizzare process.env.NODE_ENVo app.get('env')rilevare l'ambiente e configurare l'app di conseguenza".
Chris Bartley,

3
Penso che sia meglio usare app.get ('env') perché se l'ambiente è indefinito il nodo predefinito dev per dev dove come solo il controllo della variabile da te dà indefinito
light24bulbs

11
Un buon punto: ho aggiunto una nota per evidenziare l'impostazione predefinita. Tuttavia la mia sensazione personale è che non dovresti usare app.get('env')proprio per questo motivo. Copre che questa importante variabile non è impostata, rendendo le cose incoerenti quando vi si accede dall'esterno di express. Inoltre, penso che sia meno dannoso avere il codice di debug accidentalmente non in esecuzione su un ambiente di sviluppo di quanto lo sia avere accidentalmente in esecuzione su un ambiente di produzione.
Ed Hinchliffe,

5
Ho misurato gli effetti dell'omissione dell'impostazione NODE_ENV nelle applicazioni express. Per impostazione predefinita, developmentciò significa che, tra le altre cose, i modelli verranno rielaborati per ogni richiesta. La conseguenza è un aumento delle prestazioni o un drenaggio del ~ 75% tra produzione e sviluppo quando si utilizza Jade. Ho anche creato un post sul blog su quel apmblog.dynatrace.com/2015/07/22/…
DanielKhan

8
Penso che per i progetti espressi, oltre a "produzione" e "sviluppo", almeno hai bisogno di un altro "test" per eseguire i test automatizzati. È possibile che si desideri utilizzare un DB diverso per i dati di test popolati.
dawnstar

19

NODE_ENV è una variabile ambientale che rappresenta l' ambiente del nodo nel server espresso.

È il modo in cui impostiamo e rileviamo l'ambiente in cui ci troviamo.

È molto comune usare productione development.

Impostato:

export NODE_ENV=production

Ottenere:

Puoi ottenerlo usando app.get('env')


11

Presumo che la domanda originale includesse come Express usa questa variabile d'ambiente.

Express utilizza NODE_ENV per modificare il proprio comportamento predefinito. Ad esempio, in modalità di sviluppo, il gestore degli errori predefinito invierà una traccia stack al browser. In modalità di produzione, la risposta è semplicemente quella Internal Server Errordi evitare la perdita di dettagli di implementazione nel mondo.


0

In genere, si utilizza la NODE_ENVvariabile per eseguire azioni speciali durante lo sviluppo, il test e il debug del codice. Ad esempio per produrre output dettagliati di registrazione e debug che non si desidera in produzione. Express si comporta in modo diverso a seconda che NODE_ENVsia impostato productiono meno. Puoi vederlo se inserisci queste righe in un'app Express e fai una richiesta HTTP GET per /error:

app.get('/error', function(req, res) {
  if ('production' !== app.get('env')) {
    console.log("Forcing an error!");
  }
  throw new Error('TestError');
});

app.use(function (req, res, next) {
  res.status(501).send("Error!")
})

Nota che quest'ultimo app.use()deve essere l'ultimo, dopo tutti gli altri gestori di metodi!

Se si imposta NODE_ENVa productionprima di iniziare il vostro server, e quindi inviare un GET /errorrichiesta di esso, non si dovrebbe vedere il testo Forcing an error!nella console, e la risposta non deve contenere una traccia dello stack nel corpo HTML (le cui origini da espresso). Se, invece, si imposta NODE_ENVsu qualcos'altro prima di avviare il server, dovrebbe accadere il contrario.

In Linux, imposta la variabile di ambiente NODE_ENV in questo modo:

export NODE_ENV = ' valore '

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.