process.env.NODE_ENV tidak terdefinisi

168

Saya mencoba mengikuti tutorial tentang NodeJs. Saya tidak berpikir saya melewatkan sesuatu tetapi setiap kali saya memanggil satu process.env.NODE_ENV-satunya nilai yang saya dapatkan tidak terdefinisi. Menurut penelitian saya, nilai standarnya adalah 'pengembangan'. Bagaimana nilai ini ditetapkan secara dinamis dan di mana awalnya ditetapkan?

basheps
sumber
untuk mengatur NODE_ENV untuk aplikasi heroku yang dapat Anda gunakan:heroku config:set NODE_ENV="production"
Connor Leech
14
Meskipun jawaban di bawah ini akan menyelesaikan masalah sementara dengan menetapkan variabel lingkungan, pelajaran yang lebih besar di sini adalah bahwa Anda tidak akan pernah tahu apakah ada variabel lingkungan yang akan ditetapkan ... Jadi tulis kode Anda sesuai dan uji apakah sudah diatur dan jika demikian, Untuk apa. Jangan membuat asumsi tentang itu.
Stijn de Witt

Jawaban:

193

process.env adalah referensi ke lingkungan Anda, jadi Anda harus mengatur variabel di sana.

Untuk mengatur variabel lingkungan di Windows :

SET NODE_ENV=development

pada OS X atau Linux :

export NODE_ENV=development
James Tikalsky
sumber
4
Anda dapat menambahkan bahwa jika NODE_ENV tidak disetel, aplikasi berperilaku seperti dalam mode "pengembangan"
Rocco
1
Untuk Linux, vi ~ / .bash_profile, lalu masukkan NODE_ENV = pengembangan dan simpan.
stonyau
6
Jika ada orang lain yang kesulitan ... ada perbedaan antara "SET V = VAL" dan "SET V = VAL". Ruang penting.
willem
4
Perhatikan bahwa modul "cross-env" melakukan hal yang sama dengan yang di atas, dan itu akan bekerja pada OSX dan Windows: "cross-env NODE_ENV = development". Anda harus menginstal cross-env terlebih dahulu: "npm install cross-env --save". Memiliki itu dalam skrip di package.json Anda dan Anda baik untuk pergi di kedua platform.
Antonio Brandao
6
Tidak bekerja untuk saya. Saya dieksekusi export NODE_ENV=developmentdi terminal Mac saya sebelum melakukan react-native run-iosdari terminal yang sama. Saat debugging, nilai process.env.NODE_ENVtidak terdefinisi.
Ash
58

tips

di package.json:

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

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

jadi, ini mungkin lebih baik:

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

atau

console.log(process.env.NODE_ENV.trim() === 'dev') // true
kenberkeley
sumber
2
Apa yang dapat Anda lakukan adalah ini, jadi Anda tidak perlu memotong:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah
Observasi luar biasa, console.log(process.env.NODE_ENV.length) // 4 (termasuk spasi di akhir)
gregn3
1
Ini lebih aman:, console.log(('' + process.env.NODE_ENV).trim() === 'dev') // truekarena tidak akan menimbulkan kesalahan bahkan jika process.env.NODE_ENV tidak terdefinisi.
gregn3
52

Untuk orang-orang yang menggunakan * nix (Linux, OS X, dll.), Tidak ada alasan untuk melakukannya melalui perintah ekspor kedua, Anda dapat mengaitkannya sebagai bagian dari perintah pemanggilan:

NODE_ENV=development node server.js

Lebih mudah, bukan? :)

mlaccetti
sumber
3
Paket seperti cross-env akan memungkinkannya untuk bekerja di windows juga.
walkerrandophsmith
35

Kami mengalami masalah ini ketika bekerja dengan node di Windows.

Alih-alih mengharuskan siapa pun yang mencoba menjalankan aplikasi untuk mengatur variabel-variabel ini, kami memberikan mundur dalam aplikasi.

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

Dalam lingkungan produksi, kami akan mendefinisikannya per metode biasa (SET / ekspor).

Yakub
sumber
3
Ini adalah solusi yang paling pragmatis.
druskacik
12

Anda dapat menggunakan paket cross-env npm. Ini akan menangani pemangkasan variabel lingkungan, dan juga akan memastikan itu berfungsi di berbagai platform.

Di root proyek, jalankan:

npm install cross-env

Kemudian di package.json Anda, di bawah skrip, tambahkan:

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

Kemudian di terminal Anda, di root proyek, mulai aplikasi Anda dengan menjalankan:

npm start

Variabel lingkungan kemudian akan tersedia di aplikasi Anda process.env.NODE_ENV, sehingga Anda dapat melakukan sesuatu seperti:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}
Liran H
sumber
Saya pikir ini tidak berhasil. Sudah mencoba dalam proyek saya saat ini dan NODE_ENV masih belum ditentukan. Ini mungkin membutuhkan beberapa konfigurasi untuk bekerja.
Aakash Thakur
1
Saya mencari sekitar dua jam untuk menemukan jawaban ini, terima kasih!
Bob
npm install --save-dev cross-env
DalSoft
9

di package.json kita harus mengkonfigurasi seperti di bawah ini (berfungsi di Linux dan Mac OS)

yang penting adalah "ekspor NODE_ENV = produksi" setelah perintah build Anda di bawah ini adalah contoh:

  "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",
  } 
  • untuk lingkungan dev, kita harus menekan perintah "npm run dev"

  • untuk lingkungan produksi, kita harus menekan perintah "npm run start"

DV Yogesh
sumber
9

Di macOS bagi mereka yang menggunakan versi ekspres 4.x.xdan menggunakan DOTENVplugin, perlu menggunakan seperti ini:

  1. Setelah menginstal impor plugin seperti berikut ini di file tempat Anda init aplikasi: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. Di direktori root buat file '.env' dan tambahkan yang dapat divariabel seperti:

    NODE_ENV=development atau NODE_ENV = development

NRP
sumber
6

Di UBUNTU gunakan:

$ export NODE_ENV = tes

Gilbert Flamino
sumber
1

Ini karena OS

Di package.json Anda, pastikan memiliki skrip Anda (Di mana app.js adalah file js utama Anda yang akan dieksekusi & NODE_ENV dideklarasikan dalam file .env) .Eg:

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

Untuk windows

Juga atur variabel file .env Anda dengan NODE_ENV = pengembangan

Jika file .env Anda ada di folder untuk folder eg.config pastikan untuk menentukan di app.js (file js utama Anda)

const dotenv = membutuhkan ('dotenv'); dotenv.config ({path: './config/config.env'});

Adrian Almeida
sumber
0

Jika Anda menghadapi masalah ini di Bereaksi, Anda perlu [email protected] dan lebih tinggi. Juga untuk variabel lingkungan lain selain NODE_ENVbekerja di Bereaksi, mereka harus diawali dengan REACT_APP_.

Daniel
sumber
0

Sedini mungkin dalam aplikasi Anda, minta dan konfigurasikan dotenv.

require('dotenv').config()

Khushwant kodecha
sumber
-3

Anda juga dapat mengaturnya dengan kode, misalnya:

process.env.NODE_ENV = 'test';

joaquindev
sumber
67
SAYA SANGAT mencegah siapa pun dari pernah mengubah pengenal lingkungan dalam logika aplikasi. Anda tidak pernah ingin aplikasi itu tiba-tiba berpikir itu adalah sesuatu yang lain daripada yang sebenarnya. Ini hanya boleh diubah pada tingkat sistem, seperti yang banyak disarankan oleh jawaban lain.
Kafoso
7
Anda mungkin ingin membaca tentang aplikasi 12 faktor: 12factor.net/config . Kode ini akan melanggar itu. Ada alasan bagus untuk memisahkan konfigurasi Anda dari kode Anda.
jcollum
1
Mungkin bermanfaat hanya untuk pengujian otomatis, tetapi bahkan kemudian dapat diabstraksi dan disuntikkan ke kode utama Anda, daripada dibaca langsung dari env.
Angelos Pikoulas
Sebaiknya jangan terlalu sering menurunkan jawaban ini sehingga komentar informatif dari @Kafoso berkurang. Atau tambahkan informasi ini ke jawaban yang dipilih dengan baik.
Vibhor Dube