So setzen Sie NODE_ENV in OS X auf Produktion / Entwicklung


Antworten:


662

Bevor Sie Ihre App ausführen, können Sie dies in der Konsole tun.

export NODE_ENV=production

Oder wenn Sie in Windows sind, können Sie dies versuchen:

SET NODE_ENV=production

oder Sie können Ihre App folgendermaßen ausführen:

NODE_ENV=production node app.js

Sie können es auch in Ihrer js-Datei festlegen:

process.env.NODE_ENV = 'production';

Ich empfehle jedoch nicht, dies in Ihrer Laufzeitdatei zu tun, da es nicht einfach ist, VIM auf Ihrem Server zu öffnen und auf Produktion umzustellen. Sie können eine config.json-Datei in Ihrem Verzeichnis erstellen. Jedes Mal, wenn Ihre App ausgeführt wird, liest sie daraus und legt die Konfiguration fest.


12
Das ist ein schlechter Rat. Es wird schwierig, die Einstellung process.env.NODE_ENVzuverlässig über die App selbst vorzunehmen. Stellen Sie Ihre Umgebungsvariable am besten richtig ein, wie Daniel unten verlinkt hat.
MK Safi

15
Ich bin ein Fan von NODE_ENVexpliziten Einstellungen jedes Mal, wenn Sie die App ausführen, wie im zweiten Beispiel ( NODE_ENV=production node app.js). Auf diese Weise ersparen Sie sich möglicherweise ein paar zukünftige Haarsträhnen, falls Sie vergessen, Ihren lokalen Standort NODE_ENVzurückzusetzen development.
Jon

Gar nicht so genial. Jedes Mal, wenn Sie Ihre App ausführen, müssen Sie diese env var hinzufügen. Das ist Scheiße. Bessere Lösung unten gepostet.
Lukas Liesis

2
Eine einfache plattformübergreifende Lösung finden Sie unter npmjs.com/package/cross-env . cross-env NODE_ENV=productionfunktioniert unter Windows und Linux / Mac.
AntonB

1
@ Gleb NODE_ENV=production forever app.jssollte funktionieren.
Farid Nouri Neshat

102

in package.json:

{
  ...
  "scripts": {
    "start": "NODE_ENV=production node ./app"
  }
  ...
}

dann im Terminal ausführen:

npm start

1
Beginnen Sie nicht damit, eine Reihe von Skripten in package.json einzufügen. Dies ist eine schlechte Praxis, da Sie Inkonsistenzen einführen und die Unveränderlichkeit in Ihren Projekten zunichte machen. Ich weiß, dass viele Leute Skripte erstellen, um Grunzen oder Schlucken auszuführen, aber tun Sie das nicht
PositiveGuy

38
@WeDoTDD wovon redest du? Diese Skripte sollen ähnlich wie Makefile verwendet werden. Die Verwendung als Beispiel oder zum Ausführen von gulp ist ein durchaus vernünftiger Anwendungsfall. Für einfache Aufgaben verwende ich jetzt nicht einmal gulp und erledige alles innerhalb des Skripts. Es ist viel schneller, Dinge zum Laufen zu bringen, und ich lasse Webpack die Arbeit erledigen, die früher von gulp erledigt wurde.
Marko Grešak

15
@WTF - Was meinst du damit, dass es "schlechte Praxis" ist, Skripte in package.json zu verwenden? Das ist der Punkt des Skripts: Abschnitt, um Skripte zu setzen! Es ist vollkommen gültig und macht Schluck oder Grunzen überflüssig. Alles über Befehl und Webpack.
TetraDev

6
@WTF Die Verwendung von Skripten verbessert die Konsistenz erheblich. Sie können einen Standardsatz von Befehlen einrichten, die für mehrere Projekte verwendet werden und möglicherweise nicht dieselben zugrunde liegenden Build-Skripte, Bibliotheken usw. verwenden. Sie könnten zumindest versuchen, Ihren Standpunkt mit Fakten und Beispielen zu untermauern.
Lewis Diamond

4
Das NODE_ENV=productionEinfügen von package.json macht wenig Sinn. Wenn Sie npm startin der Entwicklung arbeiten, wird es in der Produktion ausgeführt. Sie können Ihren Code so schreiben, als wäre er immer eine Produktion, da Sie ihn immer so ausführen. Der einzige Grund, warum ich dies sehe, besteht darin, andere Module (z. B. Express) zu zwingen, im Produktionsmodus ausgeführt zu werden. Warum überhaupt Umgebungsvariablen verwenden, wenn sie sich nie ändern?
Nateowami

66

.envHier noch niemand erwähnt ? Erstellen Sie dann eine .envDatei in Ihrem App-Stammverzeichnis require('dotenv').config()und lesen Sie die Werte. Leicht zu ändern, leicht zu lesen, plattformübergreifend.

https://www.npmjs.com/package/dotenv


1
Seltsam, niemand erwähnt es, meiner Meinung nach die beste Lösung. Fügen Sie den Umgebungsnamen mit den übrigen Variablen in dieselbe Datei ein.
Asinus Rex

2
Das Festlegen von NODE_ENV in der ENV-Datei funktioniert nicht. Siehe dies: github.com/motdotla/dotenv/issues/328
Michael Zelensky

Bei mir hat die Einstellung "mode": "production"in der .envDatei funktioniert.
DarkLite1

46

export NODE_ENV=production ist eine schlechte Lösung, sie verschwindet nach dem Neustart.

Wenn Sie sich nicht mehr um diese Variable kümmern möchten, fügen Sie sie dieser Datei hinzu:

/etc/environment

Verwenden Sie keine Exportsyntax, schreiben Sie einfach (in eine neue Zeile, wenn bereits Inhalte vorhanden sind):

NODE_ENV=production

es funktioniert nach dem Neustart. Sie müssen den Befehl export NODE_ENV = Production nirgendwo mehr erneut eingeben und den Knoten nur mit allem verwenden, was Sie möchten - für immer, pm2 ...

Für Heroku:

heroku config:set NODE_ENV="production"

Das ist eigentlich Standard.


2
Wartungsalptraum. Was ist mit einer Box, in der Sie keine Berechtigungen für / etc haben?
Thomas McCabe

1
Ich persönlich verwende NODE_ENV=production gulp bundle-production-appes, um ein produktionsfertiges Skript zu bündeln. Auf dem Server befindet sich NODE_ENV in der Serverumgebung und auf dem Dev-Computer nicht. In einigen Maschinen ist es ein Albtraum, wenn es nicht eingestellt ist und Sie erwarten, dass es immer eingestellt ist . In einigen Fällen erwarten Sie, dass Sie es nicht haben, also fügen Sie es nicht hinzu. Wie auch immer, während ich Benutzeroberflächen mache, mache ich klar, ob es sich im Entwicklungsmodus befindet, so dass Sie nie eine Frage haben, ob es ein- oder ausgeschaltet ist. Wenn NODE_ENV! == Produktion ist, ist es in Ihrem Gesicht, dass Sie sich in einem anderen Modus befinden, also überhaupt kein Albtraum. Alles klar, alles gut.
Lukas Liesis

+1 für das Sprechen darüber, wie man es bestehen lässt. Ich frage mich, wie viele Leute es nur in der aktuellen Sitzung eingestellt haben und denken, dass es bestehen bleibt. Was ist vor einem Neustart? Wenn Sie es sofort einstellen möchten, sollten Sie es einsetzen /etc/environment und ausführen export NODE_ENV=production?
Nateowami

23

Um sich keine Sorgen machen zu müssen, ob Sie Ihre Skripte unter Windows, Mac oder Linux ausführen, installieren Sie das Cross-Env- Paket. Dann können Sie Ihre Skripte einfach verwenden, wie folgt:

"scripts": {
    "start-dev": "cross-env NODE_ENV=development nodemon --exec babel-node -- src/index.js",
    "start-prod": "cross-env NODE_ENV=production nodemon --exec babel-node -- src/index.js"
}

Massive Requisiten an die Entwickler dieses Pakets.

npm install --save-dev cross-env

22
heroku config:set NODE_ENV="production"

2
ahhh das ist was ich brauchte. Du bist großartig
Connor Leech

5
NODE_ENV=productionist jetzt die Standardeinstellung in Heroku node.js.
Sean

1
Heroku ist nicht der einzige Ort zum Einsatz
Pavan Katepalli

9

Verwenden Sie für Windows Powershell diesen Befehl

$env:NODE_ENV="production" ; node app.js

6

Unter OSX würde ich empfehlen, export NODE_ENV=developmentzu Ihrem ~/.bash_profileund / oder ~/.bashrcund / oder hinzuzufügen ~/.profile.

Persönlich füge ich diesen Eintrag zu meinem hinzu ~/.bashrcund habe dann den~/.bash_profile ~/.profile lasse dann den Inhalt dieser Datei importieren, damit er in allen Umgebungen konsistent ist.

Stellen Sie nach diesen Ergänzungen sicher, dass Sie Ihr Terminal neu starten, um die Einstellungen zu übernehmen.


2

Wenn Sie unter Windows sind. Öffnen Sie dann zuerst Ihren cmd im rechten Ordner

set node_env={your env name here}

Drücken Sie die Eingabetaste, dann können Sie Ihren Knoten mit starten

node app.js

Es beginnt mit Ihrer Env-Einstellung


1
verschwindet es nicht nach dem Neustart? Ich habe keine Fenster und kann es nicht selbst versuchen.
Lukas Liesis

Wenn Sie nach dem Neustart des Knotens fragen, verschwindet dieser erst, wenn Sie die Eingabeaufforderung vollständig schließen. Wenn Windows Server ofc jedoch neu startet, verschwindet es.
Garenyondem

2
Apropos Neustart des Betriebssystems. Aus diesem Grund finde ich besser einen anderen Weg, um mich nicht mehr jedes Mal zu wundern, wenn Windows-Updates installiert oder einfach neu gestartet werden.
Lukas Liesis

2

Wenn Sie Webpack in Ihrer Anwendung verwenden, können Sie es dort einfach mit festlegenDefinePlugin ...

pluginSetzen Sie in Ihrem Abschnitt NODE_ENV auf production:

plugins: [
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': '"production"',
  })
]

1

Um mehrere Umgebungen zu haben, benötigen Sie alle Antworten zuvor (NODE_ENV-Parameter und exportieren Sie ihn), aber ich verwende einen sehr einfachen Ansatz, ohne etwas installieren zu müssen. Fügen Sie in Ihre package.json einfach ein Skript für jede Umgebung ein, die Sie benötigen, wie folgt:

...
"scripts": {
    "start-dev": "export NODE_ENV=dev && ts-node-dev --respawn --transpileOnly ./src/app.ts",
    "start-prod": "export NODE_ENV=prod && ts-node-dev --respawn --transpileOnly ./src/app.ts"
  }
 ...

Starten Sie dann die App, anstatt sie zu npm startverwenden npm run script-prod.

Im Code können Sie mit auf die aktuelle Umgebung zugreifen process.env.NODE_ENV.

Voila.


NODE_ENV sollte entweder "Entwicklung" oder "Produktion" sein. Das oben Gesagte wird vom Code eines Drittanbieters nicht erkannt (obwohl Sie möglicherweise
process.env danach

1

Windows CMD -> set NODE_ENV=production

Windows Powershell -> $env:NODE_ENV="production"

MAC -> export NODE_ENV=production


0

Daniel hat eine fantastische Antwort, die der bessere Ansatz für den richtigen Bereitstellungsprozess (Setzen und Vergessen) ist.

Für diejenigen, die Express verwenden. Sie können den Grunt-Express-Server verwenden, der ebenfalls fantastisch ist. https://www.npmjs.org/package/grunt-express-server


0

Möglicherweise haben Sie zwei Instanzen eines Folgeobjekts erstellt

zum Beispiel: var con1 = new Sequelize (); var con2 = new Sequelize ();

dann tritt auch der gleiche Fehler auf

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.