Apa itu NODE_ENV dan bagaimana menggunakannya dalam Express?

184

Ini adalah aplikasi saya, saya sedang menjalankan produksi.

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

Namun, saya jadi tahu NODE_ENVdan ingin menggunakannya. Bagaimana saya bisa melakukan ini?

TIMEX
sumber
Dalam kasus Anda, saya berasumsi apa yang dapat Anda gunakan adalah app.configure('development', ...)atau "produksi" untuk menetapkan pengaturan tertentu hanya untuk pengembangan atau lingkungan produksi. Lihat expressjs.com/api.html#app.configure
Andreas Hultgren

Jawaban:

360

NODE_ENVadalah variabel lingkungan yang dipopulerkan oleh kerangka kerja server web ekspres . Ketika aplikasi node dijalankan, ia dapat memeriksa nilai variabel lingkungan dan melakukan hal-hal yang berbeda berdasarkan nilai tersebut. NODE_ENVsecara khusus digunakan (dengan konvensi) untuk menyatakan apakah suatu lingkungan tertentu adalah produksi atau lingkungan pengembangan . Kasing yang umum digunakan adalah menjalankan kode debugging atau logging tambahan jika berjalan di lingkungan pengembangan.

Mengakses NODE_ENV

Anda dapat menggunakan kode berikut untuk mengakses variabel lingkungan sendiri sehingga Anda dapat melakukan pemeriksaan dan logika Anda sendiri:

var environment = process.env.NODE_ENV

Atau sebagai alternatif menggunakan express ' app.get('env')( catatan: defaultnya adalah "development")

Ketahuilah bahwa jika Anda belum menetapkan secara eksplisit NODE_ENVuntuk lingkungan Anda, itu akan terjadi undefined.

Pengaturan NODE_ENV

Bagaimana sebenarnya mengatur variabel lingkungan bervariasi dari sistem operasi ke sistem operasi, dan juga tergantung pada pengaturan pengguna Anda.

Jika Anda ingin mengatur variabel lingkungan sebagai satu kali, Anda dapat melakukannya dari baris perintah:

  • linux & mac :export NODE_ENV=production
  • windows :$env:NODE_ENV = 'production'

Dalam jangka panjang Anda harus bertahan ini sehingga tidak disetel jika Anda reboot - daripada mendaftar semua metode yang mungkin untuk melakukan ini, saya akan membiarkan Anda mencari cara melakukannya sendiri!

Konvensi telah menentukan bahwa hanya ada dua nilai yang harus Anda gunakan untuk NODE_ENV, baik productionatau development, semua huruf kecil. Tidak ada yang menghentikan Anda menambahkan lebih banyak nilai, tetapi mungkin itu bukan ide yang baik, karena saya melihat banyak kode semacam ini di banyak node_modules yang saya gunakan:

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

Perhatikan bahwa ini adalah ide yang sangat buruk untuk mencoba mengatur NODE_ENVdari dalam aplikasi simpul itu sendiri - jika Anda melakukannya hanya akan berlaku untuk proses dari mana itu ditetapkan , sehingga hal-hal yang mungkin tidak akan berfungsi seperti yang Anda harapkan. Jangan lakukan itu - Anda akan menyesalinya.

Ed Hinchliffe
sumber
5
Di Express 4, app.configure()telah dihapus. The Express bintang 4 panduan migrasi menyarankan untuk "penggunaan process.env.NODE_ENVatau app.get('env')untuk mendeteksi lingkungan dan mengkonfigurasi aplikasi yang sesuai."
Chris Bartley
3
Saya pikir yang terbaik adalah menggunakan app.get ('env') karena jika lingkungannya adalah simpul yang tidak ditentukan, default ke dev di mana hanya memeriksa variabel sendiri memberikan undefined
light24bulbs
11
Poin bagus - Saya menambahkan catatan untuk menyorot default. Namun perasaan pribadi saya adalah bahwa Anda tidak boleh menggunakan app.get('env')untuk alasan itu. Ini menutupi bahwa variabel penting ini tidak diatur - membuat hal-hal tampak tidak konsisten ketika Anda mengaksesnya dari luar express. Lebih lanjut saya pikir itu kurang berbahaya untuk memiliki kode debug secara tidak sengaja tidak berjalan pada lingkungan pengembangan daripada harus secara tidak sengaja berjalan pada lingkungan produksi.
Ed Hinchliffe
5
Saya telah mengukur efek dari menghilangkan pengaturan NODE_ENV dalam aplikasi ekspres. Standarnya adalah developmentyang - antara lain - berarti templat akan diproses ulang untuk setiap permintaan. Konsekuensinya adalah keuntungan atau tiriskan kinerja ~ 75% antara produksi dan pengembangan saat menggunakan Jade. Saya juga telah membuat posting blog di apmblog.dynatrace.com/2015/07/22/...
DanielKhan
8
Saya pikir untuk proyek kilat, selain "produksi" dan "pengembangan", Anda setidaknya memerlukan satu lagi "tes" untuk menjalankan tes otomatis. Anda mungkin ingin menggunakan DB yang berbeda untuk data uji yang diisi.
dawnstar
19

NODE_ENV adalah variabel lingkungan yang mewakili lingkungan simpul di server ekspres.

Begitulah cara kami mengatur dan mendeteksi di lingkungan mana kita berada.

Ini sangat umum menggunakan productiondan development.

Set:

export NODE_ENV=production

Dapatkan:

Anda bisa menggunakannya app.get('env')

Alireza
sumber
11

Saya menganggap pertanyaan awal termasuk bagaimana cara Express menggunakan variabel lingkungan ini.

Express menggunakan NODE_ENV untuk mengubah perilaku default sendiri. Misalnya, dalam mode pengembangan, penangan kesalahan default akan mengirim kembali stacktrace ke browser. Dalam mode produksi, responsnya sederhana Internal Server Error, untuk menghindari bocornya detail implementasi ke dunia.

Randy Hudson
sumber
0

Biasanya, Anda akan menggunakan NODE_ENVvariabel untuk mengambil tindakan khusus ketika Anda mengembangkan, menguji dan men-debug kode Anda. Misalnya untuk menghasilkan keluaran pendataan dan debug terperinci yang tidak Anda inginkan dalam produksi. Ekspres sendiri berperilaku berbeda tergantung pada apakah NODE_ENVdiatur productionatau tidak. Anda dapat melihat ini jika Anda meletakkan baris ini di aplikasi Express, dan kemudian membuat permintaan HTTP GET ke /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!")
})

Perhatikan bahwa yang terakhir app.use()harus menjadi yang terakhir, setelah semua penangan metode lainnya!

Jika Anda mengatur NODE_ENVuntuk productionsebelum Anda mulai server Anda, dan kemudian mengirim GET /errorpermintaan untuk itu, Anda tidak akan melihat teks Forcing an error!di konsol, dan respon tidak boleh mengandung setumpuk jejak dalam tubuh HTML (yang asal dari Express). Sebaliknya, jika Anda mengaturNODE_ENV ke hal lain sebelum memulai server Anda, yang terjadi adalah sebaliknya.

Di Linux, atur variabel lingkungan NODE_ENV seperti ini:

ekspor NODE_ENV = ' nilai '

Kendali
sumber