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?


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

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

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? :)


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


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
}

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”


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



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


0

Jeśli napotkałeś ten problem w Reakcie, potrzebujesz respons-scripts@0.2.3 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_.



-3

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

process.env.NODE_ENV = 'test';


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.