Co to jest NODE_ENV i jak go używać w Expressie?

184

To jest moja aplikacja, obecnie pracuję nad produkcją.

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

Jednak poznałem NODE_ENVi chcę z niego korzystać. W jaki sposób mogę to zrobić?

TIMEX
źródło
W twoim przypadku zakładam, że możesz użyć app.configure('development', ...)lub „produkcji”, aby ustawić określone ustawienia tylko dla środowisk programistycznych lub produkcyjnych. Zobacz expressjs.com/api.html#app.configure
Andreas Hultgren,

Odpowiedzi:

360

NODE_ENVjest zmienną środowiskową upowszechnioną przez ekspresowy framework webserver. Gdy aplikacja węzłowa jest uruchomiona, może sprawdzić wartość zmiennej środowiskowej i wykonywać różne czynności na podstawie tej wartości. NODE_ENVw szczególności jest używany (zgodnie z konwencją) do stwierdzenia, czy dane środowisko jest środowiskiem produkcyjnym czy programistycznym . Typowym przypadkiem użycia jest uruchomienie dodatkowego kodu debugowania lub logowania, jeśli działa w środowisku programistycznym.

Dostęp do NODE_ENV

Możesz użyć następującego kodu, aby uzyskać dostęp do zmiennej środowiskowej, abyś mógł wykonać własne kontrole i logikę:

var environment = process.env.NODE_ENV

Lub alternatywnie przy użyciu express ” app.get('env')( uwaga: domyślnie jest "development")

Pamiętaj, że jeśli nie ustawiłeś wyraźnie NODE_ENVdla swojego środowiska, tak będzie undefined.

Ustawienie NODE_ENV

Sposób faktycznego ustawienia zmiennej środowiskowej różni się w zależności od systemu operacyjnego, a także zależy od konfiguracji użytkownika.

Jeśli chcesz ustawić zmienną środowiskową jako jednorazową, możesz to zrobić z wiersza poleceń:

  • Linux i Mac :export NODE_ENV=production
  • Windows :$env:NODE_ENV = 'production'

W dłuższej perspektywie powinieneś to zachować, aby nie zresetować się po ponownym uruchomieniu - zamiast wypisać wszystkie możliwe metody, to pozwolę ci poszukać, jak to zrobić!

Konwencja dictacted, że istnieją tylko dwie wartości należy użyć do NODE_ENV, albo productionalbo development, wszystko małymi literami. Nic nie stoi na przeszkodzie, aby dodać więcej wartości, ale prawdopodobnie nie jest to dobry pomysł, ponieważ widzę dużo tego rodzaju kodu w wielu modułach node_modu, których używam:

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

Zauważ, że naprawdę złym pomysłem jest próba ustawienia NODE_ENVz poziomu samej aplikacji węzła - jeśli to zrobisz, będzie ona dotyczyć tylko procesu, w którym została ustawiona , więc prawdopodobnie rzeczy nie będą działać tak, jak się tego spodziewasz. Nie rób tego - pożałujesz.

Ed Hinchliffe
źródło
5
W Express 4 app.configure()został usunięty. Przewodnik migracji Express 4 zaleca „używanie process.env.NODE_ENVlub app.get('env')wykrywanie środowiska i odpowiednie konfigurowanie aplikacji”.
Chris Bartley
3
Myślę, że najlepiej jest użyć app.get ('env'), ponieważ jeśli środowisko jest niezdefiniowane, domyślnie węzeł domyślnie jest dev, gdzie samo sprawdzenie zmiennej daje niezdefiniowane
light24bulbs
11
Dobra uwaga - dodałem notatkę, aby podświetlić wartość domyślną. Jednak moim osobistym odczuciem jest to, że nie powinieneś używać app.get('env')z tego właśnie powodu. Zakrywa to, że ta ważna zmienna nie jest ustawiona - co sprawia, że ​​wydaje się niespójna, gdy uzyskujesz do niej dostęp spoza ekspresu. Ponadto uważam, że mniej szkodliwe jest przypadkowe uruchomienie kodu debugowania w środowisku programistycznym niż przypadkowe uruchomienie go w środowisku produkcyjnym.
Ed Hinchliffe,
5
Zmierzyłem efekty pominięcia ustawienia NODE_ENV w aplikacjach ekspresowych. Domyślnie developmentoznacza to, że między innymi szablony będą przetwarzane ponownie dla każdego żądania. Konsekwencją jest zwiększenie lub zmniejszenie wydajności o ~ 75% między produkcją a rozwojem przy użyciu Jade. Stworzyłem również wpis na blogu na tym apmblog.dynatrace.com/2015/07/22/…
DanielKhan
8
Myślę, że w przypadku projektów ekspresowych oprócz „produkcji” i „rozwoju” potrzebujesz przynajmniej kolejnego „testu” do uruchomienia testów automatycznych. Możesz użyć innej bazy danych dla wypełnionych danych testowych.
dawnstar
19

NODE_ENV to zmienna środowiskowa, która oznacza środowisko węzłowe w serwerze ekspresowym.

W ten sposób ustalamy i wykrywamy środowisko, w którym się znajdujemy.

Jest to bardzo często używane productioni development.

Zestaw:

export NODE_ENV=production

Dostać:

Możesz to uzyskać za pomocą app.get('env')

Alireza
źródło
11

Zakładam, że pierwotne pytanie zawierało, w jaki sposób Express używa tej zmiennej środowiskowej.

Express używa NODE_ENV do zmiany własnego domyślnego zachowania. Na przykład w trybie programowania domyślna procedura obsługi błędów odeśle stos śledzenia do przeglądarki. W trybie produkcyjnym reakcja polega po prostu Internal Server Errorna uniknięciu przecieków na całym świecie.

Randy Hudson
źródło
0

Zazwyczaj NODE_ENVzmiennej używasz do wykonywania specjalnych działań podczas opracowywania, testowania i debugowania kodu. Na przykład, aby uzyskać szczegółowe wyniki rejestrowania i debugowania, których nie chcesz produkować. Sam Express działa inaczej w zależności od tego, czy NODE_ENVjest ustawiony na productionczy nie. Możesz to zobaczyć, umieszczając te wiersze w aplikacji Express, a następnie wysyłając żądanie HTTP GET w celu /error:

app.get('/error', function(req, res) {
  if ('production' !== app.get('env')) {
    console.log("Forcing an error!");
  }
  throw new Error('TestError');
});

app.use(function (req, res, next) {
  res.status(501).send("Error!")
})

Zauważ, że ten ostatni app.use()musi być ostatni, po wszystkich innych metodach obsługi metod!

Jeśli ustawisz NODE_ENVopcję productionprzed uruchomieniem serwera, a następnie wyślesz GET /errordo niego żądanie, nie powinieneś widzieć tekstu Forcing an error!w konsoli, a odpowiedź nie powinna zawierać śladu stosu w treści HTML (pochodzącej z Express). Jeśli zamiast tego ustawisz NODE_ENVcoś innego przed uruchomieniem serwera, powinno być odwrotnie.

W systemie Linux ustaw zmienną środowiskową NODE_ENV w następujący sposób:

eksport NODE_ENV = „ wartość

Wodza
źródło