process.env.NODE_ENV ist undefiniert

167

Ich versuche, einem Tutorial zu NodeJs zu folgen. Ich glaube nicht, dass ich etwas verpasst habe, aber wenn ich anrufe, ist process.env.NODE_ENVder einzige Wert, den ich zurück bekomme, undefiniert. Nach meinen Recherchen sollte der Standardwert "Entwicklung" sein. Wie wird dieser Wert dynamisch gesetzt und wo wird er anfänglich gesetzt?

Basheps
quelle
Um NODE_ENV für Heroku-Apps festzulegen, können Sie Folgendes verwenden:heroku config:set NODE_ENV="production"
Connor Leech
14
Obwohl die folgenden Antworten das Problem vorübergehend durch Festlegen der Umgebungsvariablen lösen, sollte die größere Lektion hier sein, dass Sie nie wissen können, ob eine Umgebungsvariable festgelegt wird ... Schreiben Sie also Ihren Code entsprechend und testen Sie, ob er festgelegt ist, und wenn ja, zu was. Machen Sie keine Annahmen darüber.
Stijn de Witt

Antworten:

192

process.env ist ein Verweis auf Ihre Umgebung, daher müssen Sie die Variable dort festlegen.

So legen Sie eine Umgebungsvariable in Windows fest :

SET NODE_ENV=development

unter OS X oder Linux :

export NODE_ENV=development
James Tikalsky
quelle
4
Sie können hinzufügen, dass sich die App wie im "Entwicklungs" -Modus verhält, wenn NODE_ENV nicht festgelegt ist
Rocco
1
Für Linux vi ~ / .bash_profile, dann NODE_ENV = development einfügen und speichern.
Stonyau
5
Falls jemand anderes Probleme hat ... gibt es einen Unterschied zwischen "SET V = VAL" und "SET V = VAL". Räume sind wichtig.
Willem
4
Beachten Sie, dass das Modul "cross-env" ähnlich wie oben ausgeführt wird und sowohl unter OSX als auch unter Windows funktioniert: "cross-env NODE_ENV = development". Sie müssen zuerst cross-env installieren: "npm install cross-env --save". Haben Sie das in einem Skript in Ihrer package.json und Sie können auf beiden Plattformen loslegen.
Antonio Brandao
6
Hat bei mir nicht funktioniert. Ich habe export NODE_ENV=developmentauf meinem Mac-Terminal ausgeführt, bevor ich eine react-native run-iosvom selben Terminal aus ausgeführt habe. Beim Debuggen ist der Wert von process.env.NODE_ENVundefiniert.
Ash
58

Tipps

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) 

Das kann also besser sein:

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

oder

console.log(process.env.NODE_ENV.trim() === 'dev') // true
Kenberkeley
quelle
2
Was Sie tun können, ist dies, so dass Sie nicht trimmen müssen:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah
Hervorragende Beobachtung, console.log(process.env.NODE_ENV.length) // 4 (einschließlich eines Leerzeichens am Ende)
gregn3
1
Dies ist sicherer: console.log(('' + process.env.NODE_ENV).trim() === 'dev') // trueEs wird kein Fehler ausgegeben, selbst wenn process.env.NODE_ENV undefiniert ist.
gregn3
52

Für Benutzer von * nix (Linux, OS X usw.) gibt es keinen Grund, dies über einen zweiten Exportbefehl zu tun. Sie können es als Teil des aufrufenden Befehls verketten:

NODE_ENV=development node server.js

Einfacher, nein? :) :)

Mlaccetti
quelle
3
Ein Paket wie cross-env ermöglicht dies auch unter Windows.
Walkerrandophsmith
34

Bei der Arbeit mit Node unter Windows ist dieses Problem aufgetreten.

Anstatt zu verlangen, dass jemand, der versucht, die App auszuführen, diese Variablen festlegt, haben wir einen Fallback innerhalb der Anwendung bereitgestellt.

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

In einer Produktionsumgebung würden wir es nach den üblichen Methoden (SET / Export) definieren.

Jacob
quelle
2
Dies ist die pragmatischste Lösung.
Druskacik
12

Sie können das Paket cross-env npm verwenden. Es kümmert sich um das Trimmen der Umgebungsvariablen und stellt auch sicher, dass es auf verschiedenen Plattformen funktioniert.

Führen Sie im Projektstamm Folgendes aus:

npm install cross-env

Fügen Sie dann in Ihrer package.json unter Skripten Folgendes hinzu:

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

Starten Sie dann in Ihrem Terminal im Projektstamm Ihre App, indem Sie Folgendes ausführen:

npm start

Die Umgebungsvariable ist dann in Ihrer App als verfügbar process.env.NODE_ENV, sodass Sie Folgendes tun können:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}
Liran H.
quelle
Ich denke nicht, dass das funktioniert. Versuchte es in meinem aktuellen Projekt und NODE_ENV ist immer noch undefiniert. Dies könnte etwas mehr Konfiguration erfordern, um zu funktionieren, wie es scheint.
Aakash Thakur
1
Ich habe ungefähr zwei Stunden gesucht, um diese Antwort zu finden, danke!
Bob
npm install --save-dev cross-env
DalSoft
9

in package.json müssen wir wie unten konfigurieren (funktioniert unter Linux und Mac OS)

Das Wichtigste ist "NODE_ENV = Produktion exportieren", nachdem Ihre Build-Befehle unten ein Beispiel sind:

  "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",
  } 
  • Für die Entwicklungsumgebung müssen wir den Befehl "npm run dev" drücken

  • Für eine Produktionsumgebung müssen wir den Befehl "npm run start" drücken

DV Yogesh
quelle
9

In macOS müssen diejenigen, die die Express-Version 4.x.xund das DOTENVPlugin verwenden, Folgendes verwenden:

  1. Nach der Installation des Plugins importieren Sie wie folgt in die Datei, in der Sie die Anwendung starten: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. Erstellen Sie im Stammverzeichnis eine Datei '.env' und fügen Sie die Variable wie folgt hinzu:

    NODE_ENV=development oder NODE_ENV = development

NRP
quelle
6

Verwenden Sie in UBUNTU:

$ export NODE_ENV = test

Gilbert Flamino
quelle
1

Es liegt am Betriebssystem

Stellen Sie in Ihrer package.json sicher, dass Ihre Skripte vorhanden sind (wobei app.js Ihre wichtigste auszuführende js-Datei ist und NODE_ENV in einer .env-Datei deklariert ist) .Eg:

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

Für Windows

Richten Sie auch Ihre .env-Dateivariable mit NODE_ENV = development ein

Wenn sich Ihre .env-Datei in einem Ordner für den Ordner eg.config befindet, müssen Sie dies in app.js (Ihrer Haupt-js-Datei) angeben.

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

Adrian Almeida
quelle
0

Wenn Sie in React auf dieses Problem gestoßen sind, benötigen Sie [email protected] und höher. Auch für andere Umgebungsvariablen als NODE_ENVdie Funktion in React muss ihnen ein Präfix vorangestellt werden REACT_APP_.

Daniel
quelle
0

Fordern und konfigurieren Sie so früh wie möglich in Ihrer Anwendung dotenv.

require('dotenv').config()

Khushwant Kodecha
quelle
-3

Sie können es auch per Code einstellen, zum Beispiel:

process.env.NODE_ENV = 'test';

joaquindev
quelle
66
Ich rate DRINGEND davon ab, jemals die Umgebungskennung in der Anwendungslogik zu ändern. Sie möchten nie, dass die Anwendung plötzlich denkt, es sei etwas anderes als es wirklich ist. Dies sollte immer nur auf Systemebene geändert werden, wie viele der anderen Antworten vermuten lassen.
Kafoso
7
Vielleicht möchten Sie mehr über 12-Faktor-Apps lesen: 12factor.net/config . Dieser Code wäre eine Verletzung davon. Es gibt gute Gründe, Ihre Konfiguration von Ihrem Code zu trennen.
JCollum
1
Es kann nur für automatisierte Tests nützlich sein, aber selbst dann kann es abstrahiert und in Ihren Hauptcode eingefügt werden, anstatt direkt aus env gelesen zu werden.
Angelos Pikoulas
Lassen Sie uns diese Antwort nicht so sehr ablehnen, dass der informative Kommentar von @Kafoso abnimmt. Oder fügen Sie diese Informationen zu einer gut abgestimmten Antwort hinzu.
Vibhor Dube