process.env.NODE_ENV jest niezdefiniowany

168

Próbuję postępować zgodnie z samouczkiem dotyczącym NodeJs. Nie sądzę, żebym coś przeoczył, ale kiedy dzwonię, process.env.NODE_ENVjedyna wartość, jaką otrzymuję, jest nieokreślona. Według moich badań wartością domyślną powinno być „rozwój”. W jaki sposób ta wartość jest ustawiana dynamicznie i gdzie jest ustawiona początkowo?

basheps
źródło
aby ustawić NODE_ENV dla aplikacji heroku, których możesz użyć:heroku config:set NODE_ENV="production"
Connor Leech
14
Chociaż poniższe odpowiedzi rozwiążą problem tymczasowo poprzez ustawienie zmiennej środowiskowej, większą lekcją powinno być to, że nigdy nie możesz wiedzieć, czy jakakolwiek zmienna środowiskowa zostanie ustawiona ... Więc napisz odpowiednio swój kod i sprawdź, czy jest ustawiona, a jeśli tak, do czego. Nie zakładaj tego z góry.
Stijn de Witt

Odpowiedzi:

193

process.env jest odniesieniem do twojego środowiska, więc musisz ustawić tam zmienną.

Aby ustawić zmienną środowiskową w systemie Windows :

SET NODE_ENV=development

w systemie OS X lub Linux :

export NODE_ENV=development
James Tikalsky
źródło
4
możesz dodać, że jeśli NODE_ENV nie jest ustawione, aplikacja zachowuje się jak w trybie programistycznym
Rocco
1
W systemie Linux vi ~ / .bash_profile, a następnie wstaw NODE_ENV = programowanie i zapisz.
stonyau
6
Na wypadek, gdyby ktoś inny miał problemy ... istnieje różnica między „SET V = VAL” i „SET V = VAL”. Przestrzenie mają znaczenie.
willem
4
Zauważ, że moduł "cross-env" zrobi podobnie jak powyżej i będzie działał zarówno na OSX jak i Windows: "cross-env NODE_ENV = programowanie". Najpierw musisz zainstalować cross-env: „npm install cross-env --save”. Umieść to w skrypcie w swoim package.json i możesz przejść na obie platformy.
Antonio Brandao
6
Nie działa dla mnie. Wykonałem export NODE_ENV=developmentna moim terminalu Mac przed wykonaniem react-native run-iosz tego samego terminala. Podczas debugowania wartość process.env.NODE_ENVjest niezdefiniowana.
Ash
58

wskazówki

w package.json:

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

w 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) 

więc może to lepiej:

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

lub

console.log(process.env.NODE_ENV.trim() === 'dev') // true
kenberkeley
źródło
2
Możesz to zrobić, więc nie musisz przycinać:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah
Doskonała obserwacja, console.log(process.env.NODE_ENV.length) // 4 (w tym spacja na końcu)
gregn3
1
Jest to bezpieczniejsze: console.log(('' + process.env.NODE_ENV).trim() === 'dev') // trueponieważ nie zgłosi błędu, nawet jeśli parametr process.env.NODE_ENV jest niezdefiniowany.
gregn3
52

W przypadku osób używających * nix (Linux, OS X itp.) Nie ma powodu, aby robić to za pomocą drugiego polecenia eksportu, można je połączyć jako część polecenia wywołującego:

NODE_ENV=development node server.js

Łatwiej, nie? :)

mlaccetti
źródło
3
Pakiet taki jak cross-env pozwoli na to również w systemie Windows.
walkerrandophsmith,
35

Napotkaliśmy ten problem podczas pracy z node w systemie Windows.

Zamiast wymagać od każdego, kto próbuje uruchomić aplikację, ustawienia tych zmiennych, zapewniliśmy rezerwę w aplikacji.

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

W środowisku produkcyjnym zdefiniowalibyśmy to za pomocą zwykłych metod (SET / eksport).

Jakub
źródło
3
To najbardziej pragmatyczne rozwiązanie.
druskacik
12

Możesz użyć pakietu cross-env npm. Zadba o przycinanie zmiennej środowiskowej, a także upewni się, że działa na różnych platformach.

W katalogu głównym projektu uruchom:

npm install cross-env

Następnie w pliku package.json, w sekcji scripts, dodaj:

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

Następnie w terminalu, w katalogu głównym projektu, uruchom aplikację, uruchamiając:

npm start

Zmienna środowiskowa będzie wtedy dostępna w Twojej aplikacji jako process.env.NODE_ENV, więc możesz zrobić coś takiego:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}
Liran H.
źródło
Myślę, że to nie działa. Wypróbowałem to w moim obecnym projekcie i NODE_ENV jest nadal niezdefiniowany. Wygląda na to, że może to wymagać trochę więcej konfiguracji.
Aakash Thakur
npm install --save-dev cross-env
DalSoft
9

w package.json musimy skonfigurować jak poniżej (działa w Linuksie i Mac OS)

ważne jest, aby „eksportować NODE_ENV = produkcja” po poniższym przykładzie poleceń kompilacji:

  "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",
  } 
  • dla środowiska deweloperskiego musimy nacisnąć komendę „npm run dev”

  • w środowisku produkcyjnym musimy nacisnąć komendę „npm run start”

DV Yogesh
źródło
9

W systemie macOS dla tych, którzy używają wersji ekspresowej 4.x.xi używają DOTENVwtyczki, należy użyć w następujący sposób:

  1. Po zainstalowaniu wtyczki zaimportuj w następujący sposób w pliku, w którym inicjujesz aplikację: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. W katalogu głównym utwórz plik „.env” i dodaj zmienną, taką jak:

    NODE_ENV=development lub NODE_ENV = development

NRP
źródło
6

W UBUNTU użyj:

$ export NODE_ENV = test

Gilbert Flamino
źródło
1

Wynika to z systemu operacyjnego

W pliku package.json upewnij się, że masz skrypty (gdzie app.js jest głównym plikiem js do wykonania, a NODE_ENV jest zadeklarowany w pliku .env).

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

Dla Windowsa

Skonfiguruj także zmienną pliku .env z NODE_ENV = programowanie

Jeśli twój plik .env znajduje się w folderze np. Folder config, upewnij się, że podałeś go w app.js (głównym pliku js)

const dotenv = require ('dotenv'); dotenv.config ({ścieżka: './config/config.env'});

Adrian Almeida
źródło
0

Jeśli napotkałeś ten problem w Reakcie, potrzebujesz [email protected] i wyższej. Również w przypadku innych zmiennych środowiskowych, niż te, które NODE_ENVmają działać w Reakcie, muszą być poprzedzone REACT_APP_.

Daniel
źródło
0

Jak najwcześniej w swojej aplikacji, wymagaj i skonfiguruj dotenv.

require('dotenv').config()

Khushwant kodecha
źródło
-3

Możesz również ustawić kod, na przykład:

process.env.NODE_ENV = 'test';

joaquindev
źródło
67
MOCNIE zniechęcam kogokolwiek do zmiany identyfikatora środowiska w logice aplikacji. Nigdy nie chcesz, aby aplikacja nagle pomyślała, że ​​jest czymś innym, niż jest w rzeczywistości. Należy to zmienić tylko na poziomie systemu, jak sugeruje wiele innych odpowiedzi.
Kafoso 07.07.15
7
Możesz przeczytać o aplikacjach 12-czynnikowych: 12factor.net/config . Ten kod byłby jego pogwałceniem. Istnieją dobre powody, aby trzymać konfigurację oddzielnie od kodu.
jcollum
1
Może być przydatny tylko do testów automatycznych, ale nawet wtedy można by go wyodrębnić i wstrzyknąć do głównego kodu, zamiast być czytany bezpośrednio z env.
Angelos Pikoulas
Nie lekceważmy tej odpowiedzi tak bardzo, że pouczający komentarz @Kafoso zostanie zmniejszony. Lub dodaj tę informację do dobrze przegłosowanej odpowiedzi.
Vibhor Dube