process.env.NODE_ENV tanımsız


169

NodeJs hakkında bir eğitim takip etmeye çalışıyorum. Ben bir şey kaçırdım sanmıyorum ama ne zaman çağırsam ben process.env.NODE_ENVgeri almak tek değer undefined. Araştırmamıza göre varsayılan değer 'gelişme' olmalıdır. Bu değer dinamik olarak nasıl ayarlanır ve başlangıçta nerede ayarlanır?


Kullanabileceğiniz heroku uygulamaları için NODE_ENV ayarlamak için:heroku config:set NODE_ENV="production"
Connor Leech

14
Aşağıdaki yanıtlar, ortam değişkenini ayarlayarak sorunu geçici olarak çözecek olsa da, burada daha büyük olan ders, herhangi bir ortam değişkeninin ayarlanıp ayarlanmayacağını asla bilmemelisiniz ... Bu nedenle kodunuzu uygun şekilde yazın ve ayarlanıp ayarlanmadığını test edin, neye. Bu konuda varsayımlarda bulunmayın.
Stijn de Witt

Yanıtlar:


193

process.env ortamınıza bir referanstır, bu nedenle değişkeni orada ayarlamanız gerekir.

Windows'da bir ortam değişkeni ayarlamak için :

SET NODE_ENV=development

OS X veya Linux'ta :

export NODE_ENV=development

4
NODE_ENV ayarlanmadıysa uygulamanın "geliştirme" modunda olduğu gibi davrandığını ekleyebilirsiniz
Rocco

1
Linux için vi ~ / .bash_profile, sonra NODE_ENV = geliştirme öğesini ekleyin ve kaydedin.
stonyau

6
Başkasının mücadelesi olması halinde ... "SET V = VAL" ile "SET V = VAL" arasında bir fark vardır. Alanlar önemlidir.
willem

4
"Cross-env" modülünün yukarıdakine benzer şekilde yapıldığını ve hem OSX hem de Windows üzerinde çalışacağını unutmayın: "cross-env NODE_ENV = geliştirme". Önce cross-env'yi yüklemeniz gerekir: "npm install cross-env --save". Bunu paketinizdeki bir komut dosyasında bulundurun. Json ve her iki platformda da başarılı olursunuz.
Antonio Brandao

6
Benim için çalışmadı. İdam export NODE_ENV=developmentbir yapmadan önce benim Mac terminalinde react-native run-iosaynı terminalden. Hata ayıklama sırasında, değeri process.env.NODE_ENVtanımsızdır.
Ash

58

ipuçları

içinde package.json:

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

içinde 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) 

yani, bu daha iyi olabilir:

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

veya

console.log(process.env.NODE_ENV.trim() === 'dev') // true

2
Yapabileceğiniz şey, bu yüzden kırpmak zorunda değilsiniz:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah

Mükemmel gözlem, console.log(process.env.NODE_ENV.length) // 4 (sondaki boşluk dahil)
gregn3

1
Bu daha güvenlidir: process.env.NODE_ENV tanımlanmamış console.log(('' + process.env.NODE_ENV).trim() === 'dev') // trueolsa bile hata atmayacağı için.
gregn3

52

* Nix (Linux, OS X, vb.) Kullanan kişiler için, ikinci bir dışa aktarma komutuyla bunu yapmak için hiçbir neden yoktur, onu çağırma komutunun bir parçası olarak zincirleyebilirsiniz:

NODE_ENV=development node server.js

Daha kolay, değil mi? :)


3
Cross-env gibi bir paket bunun pencerelerde de çalışmasına izin verecektir.
walkerrandophsmith

35

Windows'ta düğüm ile çalışırken bu sorunla karşılaştık.

Uygulamayı çalıştırmayı deneyen herkese bu değişkenleri ayarlamalarını istemek yerine, uygulama içinde bir geri dönüş sağladık.

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

Bir üretim ortamında, onu her zamanki yöntemlere göre tanımlayacağız (SET / export).


3
Bu en pragmatik çözümdür.
druskacik

12

Sen kullanabilirsiniz çapraz env npm paketi. Ortam değişkenini düzeltmeye özen gösterecek ve farklı platformlarda çalıştığından emin olacaktır.

Proje kök dizininde şunu çalıştırın:

npm install cross-env

Sonra package.json, komut dosyalarının altına şunu ekleyin:

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

Ardından terminalinizde, proje kökünde uygulamanızı çalıştırarak başlatın:

npm start

Ortam değişkeni uygulamanızda şu şekilde kullanılabilir process.env.NODE_ENV, böylece şöyle bir şey yapabilirsiniz:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}

Bunun işe yaradığını sanmıyorum. Mevcut projemde denedim ve NODE_ENV hala tanımsız. Bu, çalışması için biraz daha yapılandırma gerektirebilir.
Aakash Thakur

npm install --save-dev cross-env
DalSoft

9

package.json'da aşağıdaki gibi yapılandırmamız gerekiyor (Linux ve Mac OS'de çalışıyor)

önemli olan aşağıdaki derleme komutlarınız bir örnek olduktan sonra "export NODE_ENV = production".

  "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",
  } 
  • dev ortamı için, "npm run dev" komutuna basmalıyız

  • bir üretim ortamı için, "npm run start" komutuna basmalıyız


9

Gelen MacOS ekspres sürümünü kullanıyorsanız olanlar için 4.x.xve kullanan DOTENVeklenti, gerek böyle kullanmak:

  1. Eklentiyi yükledikten sonra uygulamayı başlattığınız dosyada aşağıdaki gibi içe aktarın: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. Kök dizinde '.env' dosyası oluşturun ve aşağıdaki gibi değişkenleri ekleyin:

    NODE_ENV=development veya NODE_ENV = development



1

İşletim sisteminden kaynaklanıyor

Package.json dosyasında komut dosyalarınızın bulunduğundan emin olun (app.js, yürütülecek ana js dosyanızdır ve NODE_ENV bir .env dosyasında bildirilmiştir).

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

Pencereler için

Ayrıca NODE_ENV = geliştirme olan .env dosya değişkeninizi ayarlayın

.Env dosyanız, örneğin ,.config klasörü için bir klasördeyse, belirtiniz. App.js (ana js dosyanız)

const dotenv = gerektirir ('dotenv'); dotenv.config ({yol: './config/config.env'});


0

Reac'ta bu probleme rastladıysanız, tepki -scripts@0.2.3 ve daha fazlasına ihtiyacınız var. Ayrıca NODE_ENVReact'ta çalışmaktan başka ortam değişkenleri için öneklerinin eklenmesi gerekir REACT_APP_.


0

Uygulamanızda olabildiğince erken, dotenv gerekir ve yapılandırın.

require('dotenv').config()


-3

Kodla da ayarlayabilirsiniz, örneğin:

process.env.NODE_ENV = 'test';


67
Herkesin uygulama mantığındaki ortam tanımlayıcısını değiştirmesini şiddetle tavsiye etmiyorum. Uygulamanın aniden gerçekte olduğundan başka bir şey olduğunu düşünmesini asla istemezsiniz. Diğer cevapların birçoğunun önerdiği gibi, bu sadece sistem düzeyinde değiştirilmelidir.
Kafoso

7
Yaklaşık 12 faktörlü uygulamaları okumak isteyebilirsiniz: 12factor.net/config . Bu kod bunun ihlali anlamına gelir. Yapılandırmanızı kodunuzdan ayrı tutmak için iyi nedenler vardır.
jcollum

1
Sadece otomatik test için yararlı olabilir, ancak o zaman bile doğrudan env'den okumak yerine ana kodunuza soyutlanabilir ve enjekte edilebilir.
Angelos Pikoulas

@Kafoso'nun bilgilendirici yorumu azalacak şekilde bu cevabı o kadar aşağıya indirmeyelim. Veya bu bilgileri iyi oylanmış bir yanıta ekleyin.
Vibhor Dube
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.