NODE_ENV nedir ve Express'te nasıl kullanılır?


184

Bu benim app, şu anda üretim üzerinde çalışıyorum.

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

Ancak, bunu bilmek NODE_ENVve kullanmak istedim. Bunu nasıl yapabilirim?


Sizin durumunuzda, app.configure('development', ...)yalnızca geliştirme veya üretim ortamları için belirli ayarları yapmak için ne kullanabileceğinizi veya "üretim" olduğunu varsayalım . Bkz. Expressjs.com/api.html#app.configure
Andreas Hultgren

Yanıtlar:


360

NODE_ENVekspres web sunucusu çerçevesi tarafından popüler hale getirilen bir ortam değişkenidir . Bir düğüm uygulaması çalıştırıldığında, ortam değişkeninin değerini kontrol edebilir ve değere bağlı olarak farklı şeyler yapabilir. belirli bir ortamın bir üretim veya geliştirme ortamı olup olmadığını belirtmek için özel olarak kullanılır (sözleşmeyle) . Yaygın bir kullanım örneği, bir geliştirme ortamında çalışıyorsa ek hata ayıklama veya günlük kodu çalıştırmadır.NODE_ENV

NODE_ENV'ye erişiliyor

Ortam değişkenine erişmek için aşağıdaki kodu kullanarak kendi denetimlerinizi ve mantığınızı gerçekleştirebilirsiniz:

var environment = process.env.NODE_ENV

Veya alternatif olarak express 'ifadesini kullanarak app.get('env')( not: bu varsayılan olarak "development")

NODE_ENVÇevreniz için açıkça ayarlamadıysanız , bunun olacağını unutmayın undefined.

NODE_ENV ayarı

Ortam değişkeninin gerçekte nasıl ayarlanacağı işletim sisteminden işletim sistemine değişir ve ayrıca kullanıcı kurulumunuza bağlıdır.

Ortam değişkenini bir defalık olarak ayarlamak istiyorsanız, bunu komut satırından yapabilirsiniz:

  • linux ve mac :export NODE_ENV=production
  • Windows :$env:NODE_ENV = 'production'

Uzun vadede, yeniden başlatmanız durumunda ayarlanmaması için bunu devam ettirmelisiniz - bunu yapmak için tüm olası yöntemleri listelemek yerine, bunu kendiniz nasıl yapacağınızı aramanıza izin vereceğim!

Kongre için kullanması gereken yalnızca iki değer vardır dictacted etti NODE_ENV, ya productionya development, tümü küçük harf. Daha fazla değer eklemenizi engelleyen bir şey yok, ancak kullandığım node_modules'ün çoğunda bu tür kodların çoğunu gördüğüm için muhtemelen iyi bir fikir değil:

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

Bir olduğunu Not gerçekten kötü setine denemek için bir fikir NODE_ENVgelen içinde bir düğüm uygulamanın kendisinden bunu olacaktır yaparsak - sadece set alındığı sürece geçerlidir , işler muhtemelen iş onları bekliyoruz gibi pek. Yapma - pişman olacaksın.


5
Express 4'te app.configure()kaldırıldı. Ekspres 4 taşıma kılavuzu önerir "kullanımı process.env.NODE_ENVveya app.get('env')çevreyi algılamak ve buna göre uygulamasını yapılandırmak için."
Chris Bartley

3
Ben çevre dev tanımsız düğüm varsayılan ise çünkü nerede tıpkı kendin tanımsız verir değişkeni kontrol app.get ( 'env') kullanmak en iyisidir düşünüyorum
light24bulbs

11
İyi bir nokta - Varsayılanı vurgulamak için bir not ekledim. Ancak kişisel düşüncem app.get('env'), tam da bu nedenle kullanmamanızdır. Bu önemli değişkenin belirlenmediğini kapsar - ekspresin dışından eriştiğinizde şeylerin tutarsız görünmesini sağlar. Dahası, yanlışlıkla bir geliştirme ortamında çalışmayan hata ayıklama koduna sahip olmanın, yanlışlıkla bir üretim ortamında çalışmasını sağlamaktan daha az zararlı olduğunu düşünüyorum .
Ed Hinchliffe

5
Ekspres uygulamalarda NODE_ENV ayarını atlamanın etkilerini ölçtüm. Varsayılan olarak development- diğer şeylerin yanı sıra - şablonların her istek için yeniden işleneceği anlamına gelir. Sonuç Jade'i kullanırken üretim ve geliştirme arasında ~% 75'lik bir performans artışı veya boşaltmadır. Ayrıca apmblog.dynatrace.com/2015/07/22/…
DanielKhan hakkında

8
Ekspres projeler için, "üretim" ve "geliştirme" yanı sıra, otomatik testleri çalıştırmak için en azından bir tane daha "test" e ihtiyacınız var. Doldurulmuş test verileri için farklı bir DB kullanmak isteyebilirsiniz.
dawnstar

19

NODE_ENV , ekspres sunucudaki düğüm ortamını temsil eden çevresel bir değişkendir .

Hangi ortamda olduğumuzu böyle belirler ve tespit ederiz.

Bu kullanarak çok yaygındır productionve development.

Ayarlamak:

export NODE_ENV=production

Almak:

Kullanarak alabilirsiniz app.get('env')


11

Orijinal sorunun Express'in bu ortam değişkenini nasıl kullandığını içerdiğini varsayıyorum.

Express, kendi varsayılan davranışını değiştirmek için NODE_ENV kullanır. Örneğin, geliştirme modunda, varsayılan hata işleyici tarayıcıya bir yığın izlemesi gönderir. Üretim modunda, yanıt, Internal Server Erroruygulama ayrıntılarının dünyaya sızmasını önlemek içindir.


0

Genellikle, NODE_ENVdeğişkeninizi kodunuzu geliştirirken, test ederken ve hata ayıklarken özel işlemler yapmak için kullanırsınız. Örneğin, üretimde istemediğiniz ayrıntılı günlük kaydı ve hata ayıklama çıktısı üretmek için. Express'in kendisi NODE_ENV, olarak ayarlanıp ayarlanmadığına bağlı olarak farklı davranır production. Bu satırları bir Express uygulamasına koyarsanız ve daha sonra aşağıdakilere bir HTTP GET isteği yaparsanız bunu görebilirsiniz /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!")
})

İkincisinin app.use(), diğer tüm yöntem işleyicilerinden sonra son olması gerektiğini unutmayın !

Ayarlarsanız NODE_ENViçin productionsunucusunu başlatmak ve daha sonra göndermeden önce GET /errorkendisine isteği, metni görmemeli Forcing an error!konsolunda ve yanıtı (Express'ten hangi kökenleri) HTML gövdesine bir yığın izleme içermemelidir. Bunun yerine, NODE_ENVsunucunuzu başlatmadan önce başka bir şeye ayarlarsanız , bunun tersi gerçekleşmelidir.

Linux'ta, NODE_ENV ortam değişkenini şu şekilde ayarlayın:

dışa aktar NODE_ENV = ' değer '

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.