process.env.NODE_ENV non è definito


169

Sto cercando di seguire un tutorial su NodeJs. Non credo di aver perso nulla, ma ogni volta che chiamo process.env.NODE_ENVl'unico valore che ottengo è indefinito. Secondo la mia ricerca, il valore predefinito dovrebbe essere "sviluppo". Come viene impostato dinamicamente questo valore e dove viene impostato inizialmente?


per impostare NODE_ENV per le app di heroku puoi usare:heroku config:set NODE_ENV="production"
Connor Leech il

14
Sebbene le risposte seguenti risolveranno temporaneamente il problema impostando la variabile di ambiente, la lezione più grande qui dovrebbe essere che non puoi mai sapere se verrà impostata alcuna variabile di ambiente ... Quindi scrivi il tuo codice di conseguenza e verifica se è impostato e, in tal caso, a cosa. Non fare ipotesi al riguardo.
Stijn de Witt,

Risposte:


193

process.env è un riferimento al tuo ambiente, quindi devi impostare la variabile lì.

Per impostare una variabile di ambiente in Windows :

SET NODE_ENV=development

su OS X o Linux :

export NODE_ENV=development

4
potresti aggiungere che se NODE_ENV non è impostato l'app si comporta come in modalità "sviluppo"
Rocco

1
Per Linux, vi ~ / .bash_profile, quindi inserire NODE_ENV = sviluppo e salvataggio.
stonyau,

6
Nel caso in cui qualcun altro lotta ... c'è una differenza tra "SET V = VAL" e "SET V = VAL". Gli spazi contano.
Willem,

4
Si noti che il modulo "cross-env" funziona in modo simile a quanto sopra e funzionerà sia su OSX che su Windows: "cross-env NODE_ENV = development". Devi prima installare cross-env: "npm install cross-env --save". Inseriscilo in uno script nel tuo package.json e sei a posto su entrambe le piattaforme.
Antonio Brandao,

6
Non ha funzionato per me. Ho eseguito export NODE_ENV=developmentsul mio terminale Mac prima di fare uno react-native run-iosdallo stesso terminale. Durante il debug, il valore di process.env.NODE_ENVnon è definito.
Ash,

58

suggerimenti

in package.json:

"scripts": {
  "start": "set NODE_ENV=dev && node app.js"
 }

in app.js:

console.log(process.env.NODE_ENV) // dev
console.log(process.env.NODE_ENV === 'dev') // false
console.log(process.env.NODE_ENV.length) // 4 (including a space at the end) 

quindi, questo potrebbe migliorare:

"start": "set NODE_ENV=dev&& node app.js"

o

console.log(process.env.NODE_ENV.trim() === 'dev') // true

2
Quello che puoi fare è questo, quindi non devi tagliare:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah,

Osservazione eccellente, console.log(process.env.NODE_ENV.length) // 4 (incluso uno spazio alla fine)
gregn3

1
Questo è più sicuro: console.log(('' + process.env.NODE_ENV).trim() === 'dev') // truepoiché non genererà un errore anche se process.env.NODE_ENV non è definito.
Gregn3

52

Per le persone che usano * nix (Linux, OS X, ecc.), Non c'è motivo di farlo tramite un secondo comando di esportazione, è possibile concatenarlo come parte del comando invocante:

NODE_ENV=development node server.js

Più facile, no? :)


3
Un pacchetto come cross-env consentirà che funzioni anche su Windows.
walkerrandophsmith,

35

Abbiamo riscontrato questo problema durante l'utilizzo del nodo su Windows.

Invece di richiedere a chiunque tenti di eseguire l'app di impostare queste variabili, abbiamo fornito un fallback all'interno dell'applicazione.

var environment = process.env.NODE_ENV || 'development';

In un ambiente di produzione, lo definiremmo secondo i soliti metodi (SET / export).


3
Questa è la soluzione più pragmatica.
druskacik,

12

È possibile utilizzare il pacchetto cross-env npm. Si occuperà di tagliare la variabile d'ambiente e si assicurerà che funzioni su piattaforme diverse.

Nella radice del progetto, eseguire:

npm install cross-env

Quindi nel tuo package.json, sotto gli script, aggiungi:

"start": "cross-env NODE_ENV=dev node your-app-name.js"

Quindi nel terminale, nella radice del progetto, avvia l'app eseguendo:

npm start

La variabile d'ambiente sarà quindi disponibile nella tua app come process.env.NODE_ENV, quindi potresti fare qualcosa del tipo:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}

Non penso che funzioni. L'ho provato nel mio progetto attuale e NODE_ENV è ancora indefinito. Questo potrebbe aver bisogno di qualche altra configurazione per funzionare, a quanto pare.
Aakash Thakur,

npm install --save-dev cross-env
DalSoft

9

in package.json dobbiamo configurare come sotto (funziona su Linux e Mac OS)

l'importante è "export NODE_ENV = production" dopo che i tuoi comandi di compilazione sotto sono un esempio:

  "scripts": {
     "start": "export NODE_ENV=production && npm run build && npm run start-server",
     "dev": "export NODE_ENV=dev && npm run build && npm run start-server",
  } 
  • per l'ambiente di sviluppo, dobbiamo premere il comando "npm run dev"

  • per un ambiente di produzione, dobbiamo premere il comando "npm run start"


9

In macOS per coloro che utilizzano la versione express 4.x.xe il DOTENVplug-in, è necessario utilizzare in questo modo:

  1. Dopo aver installato il plug-in import come il seguente nel file in cui si avvia l'applicazione: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. Nella directory principale creare un file '.env' e aggiungere il variabile come:

    NODE_ENV=development o NODE_ENV = development



1

È dovuto al sistema operativo

Nel tuo package.json, assicurati di avere i tuoi script (dove app.js è il tuo file js principale da eseguire e NODE_ENV è dichiarato in un file .env) .Eg:

"scripts": {
    "start": "node app.js",
    "dev": "nodemon server.js",
    "prod": "NODE_ENV=production & nodemon app.js"
  }

Per windows

Imposta anche la tua variabile di file .env con NODE_ENV = sviluppo

Se il tuo file .env si trova in una cartella per la cartella eg.config assicurati di specificare in app.js (il tuo file js principale)

const dotenv = require ('dotenv'); dotenv.config ({percorso: './config/config.env'});


0

Se hai riscontrato questo problema in React, hai bisogno di reag-scripts@0.2.3 e versioni successive. Anche per altre variabili d'ambiente oltre NODE_ENVa lavorare in React, è necessario avere il prefisso REACT_APP_.


0

Il prima possibile nella tua applicazione, richiedi e configura dotenv.

require('dotenv').config()


-3

Puoi anche impostarlo per codice, ad esempio:

process.env.NODE_ENV = 'test';


67
Scoraggia vivamente a chiunque di non modificare mai l'identificatore di ambiente nella logica dell'applicazione. Non vuoi mai che l'applicazione pensi improvvisamente che sia qualcos'altro di quanto non sia in realtà. Questo dovrebbe essere modificato solo a livello di sistema, come suggeriscono molte altre risposte.
Kafoso,

7
Potresti voler leggere le app sui 12 fattori: 12factor.net/config . Questo codice sarebbe una violazione di questo. Ci sono buoni motivi per mantenere la tua configurazione separata dal tuo codice.
jcollum,

1
Potrebbe essere utile solo per i test automatizzati, ma anche in questo caso potrebbe essere estratto e iniettato nel codice principale, anziché essere letto direttamente da env.
Angelos Pikoulas,

Non ridimensioniamo così tanto questa risposta da ridurre il commento informativo di @Kafoso. Oppure aggiungi queste informazioni a una risposta ben votata.
Vibhor Dube,
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.