Was ist NODE_ENV und wie wird es in Express verwendet?

181

Dies ist meine App, ich laufe gerade in der Produktion.

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());
});

Ich habe es jedoch kennengelernt NODE_ENVund möchte es verwenden. Wie kann ich das machen?

TIMEX
quelle
In Ihrem Fall gehe ich davon aus, dass Sie app.configure('development', ...)"Produktion" verwenden können, um bestimmte Einstellungen nur für Entwicklungs- oder Produktionsumgebungen festzulegen. Siehe expressjs.com/api.html#app.configure
Andreas Hultgren

Antworten:

355

NODE_ENVist eine Umgebungsvariable, die durch das Express- Webserver-Framework populär gemacht wird . Wenn eine Knotenanwendung ausgeführt wird, kann sie den Wert der Umgebungsvariablen überprüfen und basierend auf dem Wert verschiedene Aktionen ausführen. NODE_ENVwird speziell (gemäß Konvention) verwendet, um anzugeben, ob eine bestimmte Umgebung eine Produktions- oder eine Entwicklungsumgebung ist . Ein häufiger Anwendungsfall ist das Ausführen von zusätzlichem Debugging- oder Protokollierungscode, wenn er in einer Entwicklungsumgebung ausgeführt wird.

Zugriff auf NODE_ENV

Mit dem folgenden Code können Sie selbst auf die Umgebungsvariable zugreifen, um Ihre eigenen Überprüfungen und Logik durchzuführen:

var environment = process.env.NODE_ENV

Oder alternativ mit express ' app.get('env')( Hinweis: dies ist standardmäßig "development")

Beachten Sie NODE_ENV, dass dies der Fall ist , wenn Sie dies nicht explizit für Ihre Umgebung festgelegt haben undefined.

NODE_ENV einstellen

Wie die Umgebungsvariable tatsächlich festgelegt wird, variiert von Betriebssystem zu Betriebssystem und hängt auch von Ihrer Benutzerkonfiguration ab.

Wenn Sie die Umgebungsvariable einmalig festlegen möchten, können Sie dies über die Befehlszeile tun:

  • Linux & Mac :export NODE_ENV=production
  • Fenster :$env:NODE_ENV = 'production'

Langfristig sollten Sie dies beibehalten, damit es beim Neustart nicht deaktiviert wird. Anstatt alle möglichen Methoden dafür aufzulisten, lasse ich Sie selbst suchen, wie das geht!

Die Konvention hat vorgeschrieben, dass es nur zwei Werte gibt, die Sie NODE_ENVentweder productionoder developmentnur in Kleinbuchstaben verwenden sollten. Es hindert Sie nichts daran, weitere Werte hinzuzufügen, aber es ist wahrscheinlich keine gute Idee, da ich in vielen der von mir verwendeten node_modules viel von dieser Art von Code sehe:

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

Beachten Sie, dass es sich um eine ist wirklich schlechte Idee, Satz zu versuchen , NODE_ENVvon innerhalb eines Knotens Anwendung selbst - wenn Sie es tun wird nur auf den Prozess , aus dem es wurde festgelegt , so die Dinge wahrscheinlich nicht funktionieren wie Sie es erwarten. Tu es nicht - du wirst es bereuen.

Ed Hinchliffe
quelle
5
In Express 4 app.configure()wurde entfernt. Im Express 4-Migrationshandbuch wird empfohlen, " die Umgebung zu verwenden process.env.NODE_ENVoder app.get('env')zu erkennen und die App entsprechend zu konfigurieren".
Chris Bartley
3
Ich denke, es ist am besten, app.get ('env') zu verwenden, denn wenn die Umgebung undefiniert ist, ist der Knoten standardmäßig dev, wobei nur das Überprüfen der Variablen selbst undefiniert ergibt
light24bulbs
11
Guter Punkt - Ich habe eine Notiz hinzugefügt, um die Standardeinstellung hervorzuheben. Mein persönliches Gefühl ist jedoch, dass Sie app.get('env')genau aus diesem Grund nicht verwenden sollten . Es wird verdeckt, dass diese wichtige Variable nicht festgelegt ist - was dazu führt, dass Dinge inkonsistent erscheinen, wenn Sie von außerhalb von Express darauf zugreifen. Darüber hinaus halte ich es für weniger schädlich, wenn Debug-Code versehentlich nicht in einer Entwicklungsumgebung ausgeführt wird, als wenn er versehentlich in einer Produktionsumgebung ausgeführt wird.
Ed Hinchliffe
5
Ich habe die Auswirkungen des Weglassens der Einstellung NODE_ENV in Expressanwendungen gemessen. Die Standardeinstellung developmentbedeutet unter anderem, dass Vorlagen für jede Anforderung erneut verarbeitet werden. Die Folge ist ein Leistungsgewinn oder -verlust von ~ 75% zwischen Produktion und Entwicklung bei Verwendung von Jade. Ich habe auch einen Blog-Beitrag auf diesem apmblog.dynatrace.com/2015/07/22/…
DanielKhan
8
Ich denke, für Express-Projekte benötigen Sie neben "Produktion" und "Entwicklung" mindestens einen weiteren "Test", um die automatisierten Tests durchzuführen. Möglicherweise möchten Sie eine andere Datenbank für ausgefüllte Testdaten verwenden.
Dawnstar
19

NODE_ENV ist eine Umgebungsvariable, die für steht Knotenumgebung in Express - Server.

So stellen wir fest und erkennen, in welcher Umgebung wir uns befinden.

Es ist sehr häufig mit productionund development.

Einstellen:

export NODE_ENV=production

Bekommen:

Sie können es mit bekommen app.get('env')

Alireza
quelle
10

Ich gehe davon aus, dass die ursprüngliche Frage enthielt, wie Express diese Umgebungsvariable verwendet.

Express verwendet NODE_ENV, um sein eigenes Standardverhalten zu ändern. Im Entwicklungsmodus sendet der Standard-Fehlerbehandler beispielsweise eine Stapelverfolgung an den Browser zurück. Im Produktionsmodus besteht die Antwort einfach darin Internal Server Error, zu vermeiden, dass Implementierungsdetails an die Welt weitergegeben werden.

Randy Hudson
quelle