Düğümün alması için Ortam Değişkenlerini Ayarlama


414

Bir öğreticiyi takip etmeye çalışıyorum ve diyor ki:

Kimlik bilgilerini yüklemenin birkaç yolu vardır.

  1. Ortam değişkenlerinden yüklü,
  2. Diskteki bir JSON dosyasından yüklenmiş,

Anahtarlar aşağıdaki gibi olmalıdır:

USER_ID, USER_KEY

... Bu, ortam değişkenlerinizi doğru şekilde ayarlarsanız uygulamanızdaki kimlik bilgilerini yönetmeniz gerekmediği anlamına gelir.

Bazı Google'lara dayanarak, değişkenleri ayarlamam gerektiği anlaşılıyor process.env? Bu kimlik bilgilerini nasıl ve nerede ayarlayabilirim? Örnek Lütfen.

Yanıtlar:


397

Ortam değişkenleri (bu durumda), uygulamanıza kimlik bilgilerini aktarmak için kullanılır. USER_IDve USER_KEYher ikisine de sırasıyla process.env.USER_IDve üzerinden erişilebilir process.env.USER_KEY. Bunları düzenlemeniz gerekmez, sadece içeriklerine erişin.

Onlar sadece senin yükleme arasında tercih veriyoruz gibi görünüyor USER_IDve USER_KEYbirinden process.envdiskteki bazı specificed dosya veya.

Şimdi, sihirbazı uygulamayı çalıştırdığınızda olur.

USER_ID=239482 USER_KEY=foobar node app.js

Bu, kullanıcı kimliğini 239482ve kullanıcı anahtarını olarak geçer foobar. Bu test için uygundur, ancak üretim için, büyük olasılıkla bazı bash komut dosyalarını değişkenleri dışa aktarmak için konfigüre edeceksiniz.


26
Eğer kullanıyorsanız fishyerine bash, kullanılan gerekir: env USER_ID=239482 my_command. Örneğin, node.js debugkütüphanesi için ortam değişkenlerini ayarlamak için : env DEBUG='*' node some_file.js fishshell.com/docs/current/faq.html#faq-single-env
SilentSteel

1
Ben çalışmak için "*" etrafında tırnak kaldırmak zorunda bulundu:env DEBUG=* node some_file.js
divillysausages

@SamT bu değişkenleri Ubuntu Linux'ta nasıl ayarlar?
Mohammed Zameer

1
çok sayıda env komut dosyası eklemek yerine dosya eklemek mümkün mü yoksa bir unix kullanıcısının bir bash komut dosyası oluşturması gerekiyor mu?
mibbit

@mibbit evet, dotenvhepsi bu, çünkü .envdosyanızı okuyacak ve uygulayacak.
balexandre

200

Dotenv paketine bakmanızı tavsiye ederim.

https://github.com/motdotla/dotenv

@Benxamin'in cevabında önerilen kütüphaneye benziyor, ancak çok daha temiz ve bash komut dosyaları gerektirmiyor. Ayrıca kod tabanının popüler ve bakımlı olduğunu belirtmek gerekir.

Temelde bir .env dosyasına ihtiyacınız var (ki git / mercurial / etc'den önemsenmez):

FOO=bar
BAZ=bob

Ardından, başvuru giriş dosyanıza aşağıdaki satırı olabildiğince erken yerleştirin:

require('dotenv').config();

Boom. Bitti. 'process.env' artık yukarıdaki değişkenleri içerecektir:

console.log(process.env.FOO);
// bar

'.Env' dosyası gerekli değildir, bu nedenle uygulamanızın yokluğunda düşmesi konusunda endişelenmenize gerek yoktur.


1
Uygulamanızın gerektirdiği ilgili yapılandırma ayrıntılarını koyarsanız (bu soru hakkında bilgi soruyorsa), muhtemelen yokluğunda düşer ... ancak yine de iyi bir seçenek gibi görünüyor.
John

6
Ekstra güvenlik arıyorsanız, github.com/rolodato/dotenv-safe ve birkaç test yapmalı.
ctrlplusb

1
Başvurunuzda bunu istemeniz
gerekmiyorsa

100

Komut satırında env değerlerini girmeniz yeterlidir

USER_ID='abc' USER_KEY='def' node app.js

2
Sadece Windows'ta bash kabuğu (cygwin; git araçları ile yüklü sanırım) ile benim için çalıştı ekledi.
markau

@TiborSzasz: Cygwin veya Powershell bunu düzeltmeli. Bu iki yıl sonra elbette bahsediliyor.
Orlando Marinella

9
Windows kullanımı için: SET USER_ID = 'abc'
Mike

@Mike, buna uygun bir cevap vermelisin :)
rocketspacer

6
Unix veya windwos üzerinde çalışması için çapraz env paketini ( npmjs.com/package/cross-env ) kullanabiliriz
Brij

79

Ortam değişkenini proses global değişkeni üzerinden aşağıdaki gibi ayarlayabilirsiniz:

process.env['NODE_ENV'] = 'production';

Tüm platformlarda çalışır.


22
... ortam değişkenleri kodun dışından ayarlanmayı amaçlamaktadır, girintisiz değil - bu nedenle bu amacı ve kötü bir örneği yeniyor
Soren

44
@ Çocuk sürecini başlatan düğüm programımız bu cevaptan faydalandı, bu yüzden biraz alışılmışın dışında olsa da bunun için kullanım örnekleri var
pspi

2
@pspi - Ben% 99 eminim sen yanlış yapıyorsun ve bir yazarı olmadıkça yapılandırma paketinin gibi bu yerine böyle yapılandırma paketi ile yapılmalıdır.
Soren

17
Js derleme komut dosyaları yazıyorsanız ve bunları npm'den çalıştırıyorsanız faydalıdır
Stephen Drew

28
Bu, örneğin testleri çalıştırırken ortamı ayarlamak ve geçersiz kılmak için de yararlıdır.
mtkopone

54

Bir yönetim seçeneği istiyorsanız, envs npm paketini deneyin . Ayarlandıysa ortam değerlerini döndürür. Aksi takdirde, ortamınızda yoksa genel varsayılanlar nesne değişkeninde depolanan varsayılan bir değer belirleyebilirsiniz .

Kullanılması .env dosyalarının ( "dot ee-en-vee") veya çevre birçok nedenden dolayı iyidir. Bireyler kendi yapılandırmalarını yönetebilirler. Bulut ortamlarına kendi ortam ayarlarıyla farklı ortamlar (geliştirici, sahne alanı, ürün) dağıtabilirsiniz. Ve mantıklı varsayılanlar ayarlayabilirsiniz.

Senin İçinde .envdosyada her satırın bu örnekte olduğu gibi bir girdisidir:

NODE_ENV=development
API_URL=http://api.domain.com
TRANSLATION_API_URL=/translations/
GA_UA=987654321-0
NEW_RELIC_KEY=hi-mom
SOME_TOKEN=asdfasdfasdf
SOME_OTHER_TOKEN=zxcvzxcvzxcv

Sen gerektiğini değil şunlardır .envSürüm kontrolü depoyu (sizin eklemek .gitignoredosyası).

Değişkenleri .envdosyadan ortamınıza almak için, export NODE_ENV=developmentuygulamanızı başlatmadan hemen önce eşdeğer bir komut dosyası yapmak üzere bir bash betiği kullanabilirsiniz .

#!/bin/bash
while read line; do export "$line";
done <source .env

Sonra bu uygulama javascript gider:

var envs = require('envs');

// If NODE_ENV is not set, 
// then this application will assume it's prod by default.
app.set('environment', envs('NODE_ENV', 'production')); 

// Usage examples:
app.set('ga_account', envs('GA_UA'));
app.set('nr_browser_key', envs('NEW_RELIC_BROWSER_KEY'));
app.set('other', envs('SOME_OTHER_TOKEN));

1
Hmm, bu paketi kullanmaya çalıştım ama sadece ortam değişkeni kullanımını izliyor gibi görünüyor. .Env dosyasını ( npmjs.com/package/envs ) okumaz . Doğru bir paket mi?
wawka

1
Haklısın! .Env dosyasını okumaz. Bu utanç verici. @SamT'ın belirttiği gibi .env'yi bir bash betiğiyle yüklediğimi unuttum, bu yüzden yine de çalıştı.
Benxamin

1
"( 'ENVS') iste"? "Envs" nedir?
CodyBugstein

1
'envs' bir düğüm modülünün adıdır: npmjs.com/package/envs
Benxamin

4
Ayrıca "dotenv" modülünü kullanmanızı öneririm, tüm ENV değişkenlerini bu işlem nesnesine koydu, bu arada oldukça düzgün.
Bruno de Oliveira

37

İşletim sisteminize ve kabuğunuza bağlıdır

Açık kabuk bash ile linux , siz (konsolda) böyle bir ortam değişkenleri oluşturun:

export FOO=bar

Ubuntu'daki ortam değişkenleri hakkında daha fazla bilgi için (örneğin):

Ubuntu'da ortam değişkenleri


1
O zaman bu cevaba bakınız: stackoverflow.com/questions/135688/…
leszek.hanusz

2
Peki ya Windows? Lütfen buraya ekler misiniz?
YakovL

Ah, boşver, burada cevaplandığı gibi görünüyor: stackoverflow.com/questions/9249830/…
YakovL

Linux bash'da bu değerler var mı? ya sadece terminal açıkken daha sonra diğer uygulamalarla ilgili sorunlara neden olmayacak şekilde çalıştırmak istersem ne olur?
JesseBoyd

13

Ctrlplusb'ın dediği gibi, paketi kullanmanızı tavsiye ederim dotenv , ancak bunu yapmanın başka bir yolu bir js dosyası oluşturmak ve uygulama sunucunuzun ilk satırında .

env.js:

process.env.VAR1="Some value"
process.env.VAR2="Another Value"

app.js:

require('env')
console.log(process.env.VAR1) // Some value

9

Windows kullanıcıları: Dikkat! Bu komutlar Unix için önerilir, ancak Windows'ta yalnızca geçicidir. Makinenizi yeniden başlattığınızda veya yeni bir terminal kabuğuna başlar başlamaz, yalnızca geçerli kabuk için bir değişken ayarlarlar.

  • SET TEST="hello world"
  • $env:TEST = "hello world"

Windows'ta kalıcı bir ortam değişkeni ayarlamak için, aşağıdaki yaklaşımlardan birini kullanmanız gerekir:

A) Projenizdeki .env dosyası - bu en iyi yöntemdir, çünkü ortamınızı kurmak zorunda kalmadan projenizi diğer sistemlere taşıyabileceğiniz anlamına gelir, bu sistemde kodunuzu çalıştırabileceğiniz değişkenlik gösterir.

  1. Oluşturduğunuz bir .envProje klasörü kökünde içeriği içeren dosya :TEST="hello world"

  2. Bu dosyayı okuyacak bir düğüm kodu yazın. Dotenv (npm install dotenv --save ) 'i ve ardından require('dotenv').config();düğüm kurulum kodunuz sırasında eklemenizi .

  3. Artık düğüm kodunuz erişebilecekprocess.env.TEST

Env dosyaları, kod tabanınızda olmasını istemediğiniz api anahtarlarını ve diğer sırları saklamak için iyidir. Sadece eklediğinizden emin olun .gitignore.

B) Powershell kullanın - bu, diğer terminallerde erişilebilecek bir değişken yaratacaktır. Ancak dikkat edin, bilgisayarınızı yeniden başlattıktan sonra değişken kaybolacaktır.

[Environment]::SetEnvironmentVariable("TEST", "hello world", "User")

Bu yöntem Windows forumlarında yaygın olarak önerilir, ancak insanların bir sistemin yeniden başlatılmasından sonra değişkenin devam etmediğinin farkında olduğunu sanmıyorum ....

C) Windows GUI'sini kullanma

  1. Başlat Menüsü Araması'nda veya Denetim Masası'nda "Ortam Değişkenleri" ni arayın
  2. "Sistem ortamı değişkenlerini düzenle" yi seçin
  3. Bir diyalog açılacaktır. Diyalogun altındaki "Ortam Değişkenleri" düğmesini tıklayın.
  4. Artık değişkenleri düzenlemek için küçük bir pencereniz var. Yeni bir ortam değişkeni eklemek için "Yeni" düğmesini tıklamanız yeterlidir. Kolay.

8

Adım 1: Ortam değişkenlerinizi uygun dosyalarına ekleyin. Örneğin .env.staging, ortam değişkenlerini içeren USER_IDve USER_KEYhazırlama ortamınıza özgü hazırlama ortamınız çağrılabilir .

2. Adım: senin içinde package.jsondosyaya şunları ekleyin:

"scripts": {
  "build": "sh -ac '. ./.env.${REACT_APP_ENV}; react-scripts build'",
  "build:staging": "REACT_APP_ENV=staging npm run build",
  "build:production": "REACT_APP_ENV=production npm run build",
  ...
}

sonra konuşlandırma komut dosyanızda şöyle adlandırın:

npm run build:staging

Süper basit kurulum ve cazibe gibi çalışır!

Kaynak: https://medium.com/@tacomanator/environments-with-create-react-app-7b645312c09d


2
@JohnXiao bu nasıl?
Blairg23


4

Bunu yapmak için güzel bir araç geldi.

Düğüm-env-dosya

Ortam dosyalarını (ENV değişken dışa aktarmalarını içeren) Node.js ortamına ayrıştırır ve yükler, yani process.env- Bu stili kullanır:

.env

# some env variables

FOO=foo1
BAR=bar1
BAZ=1
QUX=
# QUUX=

2

@Ctrlplusb yanıtının genişlemesi olarak, pakete
de göz atmanızı öneririm env-dot-prop.

A process.envkullanarak özellikleri ayarlamanızı / almanızı sağlar dot-path.

Diyelim ki process.envaşağıdakilerin içerdiğini varsayalım :

process.env = {
  FOO_BAR: 'baz'
  'FOO_🦄': '42'
}

Ardından ortam değişkenlerini şu şekilde değiştirebilirsiniz:

const envDotProp = require('env-dot-prop');

console.log(process.env);
//=> {FOO_BAR: 'baz', 'FOO_🦄': '42'}

envDotProp.get('foo');
//=> {bar: 'baz', '🦄': '42'}

envDotProp.get('foo.🦄');
//=> '42'

envDotProp.get('foo.🦄', {parse: true});
//=> 42

envDotProp.set('baz.foo', 'bar');
envDotProp.get('', {parse: true});
//=> {foo: {bar: 'baz', '🦄': 42}, baz: {foo: 'bar'}}

console.log(process.env);
//=> {FOO_BAR: 'baz', 'FOO_🦄': '42', BAZ_FOO: 'bar'}

envDotProp.delete('foo');
envDotProp.get('');
//=> {baz: {foo: 'bar'}}

console.log(process.env);
//=> {BAZ_FOO: 'bar'}

Bu, ortam değişkenlerini ayrıştırmanıza ve bunları uygulamanızda bir yapılandırma nesnesi olarak kullanmanıza yardımcı olur.
Ayrıca 12 faktörlü bir yapılandırma uygulamanıza yardımcı olur .


2

Başarıyla kullandığım ortam değişkenlerini yapmanın çok iyi bir yolu aşağıdadır:

A. Farklı yapılandırma dosyalarınız var :

  1. dev.js // bunun yalnızca geliştirme amaçlı tüm ortam değişkenleri vardır
    Dosya şunları içerir:

    module.exports = {
     ENV: 'dev',
     someEnvKey1 : 'some DEV Value1',
     someEnvKey2 : 'some DEV Value2'
    };
  2. stage.js // bunun yalnızca geliştirme amaçlı tüm ortam değişkenleri vardır

    ..
  3. qa.js // yalnızca qa testi için tüm ortam değişkenlerine sahiptir
    Dosya şunları içerir:

    module.exports = {
     ENV: 'dev',
     someEnvKey1 : 'some QA Value1',
     someEnvKey2 : 'some QA Value2'
    };

NOT : değerler çoğunlukla ortamla değişir, ancak tuşlar aynı kalır.

  1. daha fazlasına sahip olabilirsin

  2. z__prod.js // bunun üretim / yalnızca canlı için tüm ortam değişkenleri vardır
    NOT: Bu dosya dağıtım için hiçbir zaman paketlenmemiştir

  3. Tüm bu yapılandırma dosyalarını / config / klasörüne koy

    <projectRoot>/config/dev.js
    <projectRoot>/config/qa.js
    <projectRoot>/config/z__prod.js
    <projectRoot>/setenv.js
    <projectRoot>/setenv.bat
    <projectRoot>/setenv.sh

NOT : Ürünün adı, herkes tarafından kullanılmayacağı için diğerlerinden farklıdır.

B. yapılandırma dosyasından Seti OS / Lambda / AzureFunction / GoogleCloudFunction ortam değişkenleri

Şimdi ideal olarak, dosyadaki bu yapılandırma değişkenleri OS ortam değişkenleri (veya LAMBDA işlev değişkenleri veya Azure işlev değişkenleri, Google Cloud İşlevleri vb.) Olarak gitmelidir.

bu nedenle, Windows işletim sisteminde (veya diğer) otomasyon yazıyoruz

  1. Ayarlamak istediğimiz ortam olan bir argüman alan ' setenv ' yarasa dosyası yazdığımızı varsayın

  2. Şimdi " setenv dev " komutunu çalıştırın

a) Girilen argüman değişkeninden girişi alır (şimdilik 'dev')
b) ilgili dosyayı okuyun ('config \ dev.js')
c) Windows işletim sistemindeki (veya diğer) ortam değişkenlerini ayarlar

Örneğin,

Setenv.bat içeriği şunlar olabilir:

    node setenv.js

Setenv.js içeriği şunlar olabilir:

    // import "process.env.ENV".js file (dev.js example)
    // loop the imported file contents
    //     set the environment variables in Windows OS (or, Lambda, etc.)

Hepsi bu , ortamınız kullanıma hazır.

' Setenv qa ' yaptığınızda, tüm qa ortam değişkenleri qa.js'den kullanıma ve aynı program tarafından kullanılmaya hazır olur (her zaman process.env.someEnvKey1 öğesini ister, ancak aldığı değer qa'dır).

Umarım yardımcı olur.


1

Dotenv-webpack ile hayatınızı kolaylaştırın . Basitçe yükleyin npm install dotenv-webpack --save-devve ardından bir oluşturmak .envuygulamanızın kök dosyanın (bu eklemeyi unutmayın .gitignoreönce git push). Bu dosyayı açın ve örneğin aşağıdaki gibi bazı çevresel değişkenleri ayarlayın:

ENV_VAR_1=1234
ENV_VAR_2=abcd
ENV_VAR_3=1234abcd

Şimdi, webpack yapılandırmanıza şunu ekleyin:

const Dotenv = require('dotenv-webpack');
const webpackConfig = {
  node: { global: true, fs: 'empty' }, // Fix: "Uncaught ReferenceError: global is not defined", and "Can't resolve 'fs'".
  output: {
    libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
  },
  plugins: [new Dotenv()]
};
module.exports = webpackConfig; // Export all custom Webpack configs.

Sadece const Dotenv = require('dotenv-webpack');, plugins: [new Dotenv()]ve tabii ki module.exports = webpackConfig; // Export all custom Webpack configs.gereklidir. Ancak, bazı senaryolarda bazı hatalar alabilirsiniz. Bunlar için belirli bir hatayı nasıl düzeltebileceğinizi gösteren bir çözümünüz var.

Şimdi, her yerde sadece kullanabilirsiniz istiyorum process.env.ENV_VAR_1, process.env.ENV_VAR_2, process.env.ENV_VAR_3uygulamanızda.


0

Bir sistem env var ayarladıktan sonra tanımsız alıyordum. Kullanıcı env var APP_VERSION koymak zaman, o zaman süreç.env.APP_VERSION üzerinden düğümden değeri görüntüleyebilir


-1

Bir mac / linux kullanıyorsanız ve kullandığınız makineye yerel parametreleri almak istiyorsanız, şunları yapacaksınız:

  1. Terminal çalışmasında nano ~ / .bash_profile komutunu
  2. aşağıdaki gibi bir satır ekleyin: export MY_VAR = var
  3. kaydet ve çalıştır kaynağı ~ / .bash_profile
  4. düğümde şöyle kullanın: console.log ( process.env.MY_VAR );
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.