Menu

Node.js process.env: Umgebungsvariablen lesen

process.env ist ein Objekt mit den Umgebungsvariablen, mit denen dein Node.js-Programm gestartet wurde. Jeder Wert ist ein String oder undefined, Zahlen und Booleans wandelst du also selbst um und gibst jeder Variable einen Standardwert.

Diese Seite enthält ausführbare Editoren. Bearbeiten, ausführen und Ausgabe sofort sehen.

process.env ist ein Objekt mit einer Eigenschaft pro Umgebungsvariable, die die Shell an dein Node.js-Programm übergeben hat: process.env.PORT, process.env.DATABASE_URL und so weiter. Eine Variable, die nicht gesetzt wurde, ist undefined, und eine gesetzte Variable ist immer ein String. Lies sie einmal beim Start, gib ihr einen Standardwert und wandle sie in den Typ um, den du brauchst.

Es hat shop on port 8080 in eu-west ausgegeben (REGION wurde nie gesetzt, also hat sein Standardwert übernommen), dann string number: Die Variable ist Text, bis Number() sie umwandelt. Lösch die ersten beiden Zuweisungen und führ es noch einmal aus, um jeden Standardwert zu sehen.

Umgebungsvariablen in der Shell setzen

Die Variablen kommen von dort, wo Node.js gestartet wird. In einem Terminal:

// macOS and Linux: for one command
PORT=8080 NODE_ENV=production node app.js

// macOS and Linux: for the rest of the terminal session
export PORT=8080

// Windows PowerShell
$env:PORT = "8080"; node app.js

// Windows cmd.exe
set PORT=8080
node app.js

Hosting-Plattformen (Heroku, Render, Vercel, Docker, Kubernetes) haben eine Einstellungsseite oder eine Datei für dasselbe; dein Code liest sie auf die gleiche Weise.

Alles ist ein String

Daher kommen die meisten process.env-Bugs. 'false' und '0' sind nicht leere Strings, also truthy:

Die naive Prüfung hat debug is ON für eine Variable mit dem Wert false ausgegeben, vergleich also mit genau dem String, den du erwartest. Bei Zahlen macht Number(process.env.X) aus einem fehlenden Wert NaN, setz den Standardwert also vor der Umwandlung, wie im ersten Beispiel mit ??.

NODE_ENV

NODE_ENV ist eine Konvention, kein Feature von Node.js: Node.js setzt es nie. Bibliotheken lesen es. Express zum Beispiel blendet Stack Traces auf Fehlerseiten aus, wenn es production ist, und viele Tools überspringen Prüfungen, die nur für die Entwicklung gedacht sind.

Es hat mode: production und verbose logs: false ausgegeben; ändere 'production' in 'development', und die zweite Zeile dreht sich um. Bleib bei production, development und test, weil Bibliotheken genau diese Wörter prüfen.

.env-Dateien: --env-file und dotenv

Jede Variable vor node zu tippen, nervt auf Dauer. Eine .env-Datei hält sie in deinem Projektordner, eine pro Zeile:

// .env
PORT=8080
DATABASE_URL=postgres://localhost/shop
API_KEY=dev-key-123

Node.js 20.6 und neuer lesen sie mit einem Flag, ohne Paket:

node --env-file=.env app.js

Bei älteren Versionen, oder wenn du es lieber magst, installierst du das Paket dotenv (npm install dotenv) und lädst es ganz oben in deiner Einstiegsdatei, bevor irgendein Code process.env liest:

require('dotenv').config(); // copies .env into process.env

console.log(process.env.PORT); // 8080

Keins von beiden überschreibt eine Variable, die in der Shell schon gesetzt ist, die Einstellungen der Produktion gewinnen also gegenüber der Datei.

Bei fehlenden Variablen früh abbrechen

Eine fehlende Datenbank-URL sollte das Programm beim Start mit einer klaren Meldung stoppen, nicht eine Stunde später bei der ersten Anfrage abstürzen:

Es hat Missing environment variables: API_KEY ausgegeben; füg oben process.env.API_KEY = 'test'; hinzu, und es gibt Config OK aus. In einem echten Programm folgt auf die Meldung process.exit(1), weil ein Exit-Code ungleich null für ein Deploy-Skript oder eine Container-Plattform das Zeichen ist, dass der Start fehlgeschlagen ist.

Nie Geheimnisse committen

Trag .env an dem Tag in .gitignore ein, an dem du sie anlegst. Committe stattdessen eine .env.example mit den Variablennamen und Fake-Werten, damit andere wissen, was sie setzen müssen. Ein Schlüssel, der jemals in ein Repository gepusht wurde, gilt als geleakt und muss ersetzt werden, auch wenn du den Commit später löschst.

Häufig gestellte Fragen

Warum ist process.env.MY_VAR undefined?

Die Variable wurde in der Shell, die Node.js gestartet hat, nicht gesetzt, oder sie wurde in einem anderen Terminal gesetzt. Auch eine .env-Datei wird nicht automatisch gelesen: Starte Node.js mit --env-file=.env oder lade sie mit dotenv, bevor du den Wert liest.

Kann ich process.env ändern, während das Programm läuft?

Ja. process.env.X = 'value' ändert die Variable für den aktuellen Prozess und für jeden Kindprozess, den er später startet, aber nie für die Shell, die Node.js gestartet hat. Node.js wandelt den zugewiesenen Wert in einen String um.

Unterscheiden Umgebungsvariablen Groß- und Kleinschreibung?

Unter Linux und macOS ja: PORT und port sind zwei Variablen. Unter Windows nicht. Bleib bei Großbuchstaben mit Unterstrichen, dann stellt sich die Frage nie.

Kann der Browser process.env lesen?

Nein. Browser haben keine Umgebungsvariablen. Build-Tools wie Vite und Next.js kopieren ausgewählte Variablen beim Build in deinen Frontend-Code, was auch heißt, dass diese Werte öffentlich sind.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

Los geht's