Mengatur Variabel Lingkungan untuk Node yang akan diambil

414

Saya mencoba mengikuti tutorial dan mengatakan:

Ada beberapa cara untuk memuat kredensial.

  1. Dimuat dari variabel lingkungan,
  2. Dimuat dari file JSON pada disk,

Kuncinya harus sebagai berikut:

USER_ID, USER_KEY

... Ini berarti bahwa jika Anda mengatur variabel lingkungan dengan benar, Anda tidak perlu mengelola kredensial di aplikasi Anda sama sekali.

Berdasarkan beberapa Googling, tampaknya saya perlu mengatur variabel process.env? Bagaimana dan di mana saya menetapkan kredensial ini? Contoh Silakan.

pengguna1107173
sumber

Jawaban:

397

Variabel lingkungan (dalam hal ini) sedang digunakan untuk meneruskan kredensial ke aplikasi Anda. USER_IDdan USER_KEYkeduanya dapat diakses dari process.env.USER_IDdan process.env.USER_KEYmasing - masing. Anda tidak perlu mengeditnya, cukup mengakses isinya.

Sepertinya mereka hanya memberi Anda pilihan antara memuat Anda USER_IDdan USER_KEYdari salah satu process.envatau beberapa file tertentu pada disk.

Sekarang, keajaiban terjadi ketika Anda menjalankan aplikasi.

USER_ID=239482 USER_KEY=foobar node app.js

Itu akan melewati id pengguna 239482dan kunci pengguna sebagai foobar. Ini cocok untuk pengujian, namun untuk produksi, Anda mungkin akan mengkonfigurasi beberapa skrip bash untuk mengekspor variabel.

SAMT
sumber
26
Jika Anda menggunakan fishbukan bash, Anda perlu menggunakan: env USER_ID=239482 my_command. Misalnya, untuk mengatur variabel lingkungan untuk debugpustaka node.js ' : env DEBUG='*' node some_file.js fishshell.com/docs/current/faq.html#faq-single-env
SilentSteel
1
Saya menemukan saya harus menghapus tanda kutip di sekitar "*" agar berfungsi:env DEBUG=* node some_file.js
divillysausages
@ SamT bagaimana cara mengatur variabel-variabel ini di Ubuntu linux?
Mohammed Zameer
1
apakah mungkin untuk menambahkan file daripada menambahkan sejumlah besar skrip env atau apakah pengguna unix perlu membuat skrip bash?
mibbit
@mibbit ya, itu masalahnya dotenv, karena akan membaca .envfile Anda dan menerapkannya.
balexandre
200

Saya sangat merekomendasikan melihat paket dotenv.

https://github.com/motdotla/dotenv

Agak mirip dengan perpustakaan yang disarankan dalam jawaban dari @Benxamin, tetapi jauh lebih bersih dan tidak memerlukan skrip bash. Juga perlu dicatat bahwa basis kode populer dan terawat dengan baik.

Pada dasarnya Anda memerlukan file .env (yang saya sangat sarankan untuk diabaikan dari git / mercurial / etc):

FOO=bar
BAZ=bob

Kemudian dalam file entri aplikasi Anda, masukkan baris berikut sedini mungkin:

require('dotenv').config();

Ledakan. Selesai 'process.env' sekarang akan berisi variabel di atas:

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

File '.env' tidak diperlukan sehingga Anda tidak perlu khawatir aplikasi Anda gagal karena tidak ada.

ctrlplusb
sumber
1
Meskipun jika Anda memasukkan detail konfigurasi yang relevan yang dibutuhkan aplikasi Anda (seperti pertanyaan ini menanyakannya), maka kemungkinan itu akan jatuh karena ketidakhadirannya .. tetapi itu masih tampak sebagai pilihan yang baik.
John
6
Jika Anda mencari keamanan ekstra maka github.com/rolodato/dotenv-safe dan beberapa tes harus melakukannya.
ctrlplusb
1
Jika Anda ingin tidak perlu menggunakannya dalam aplikasi Anda: github.com/direnv/direnv
AlecRust
100

Cukup berikan nilai env pada baris perintah

USER_ID='abc' USER_KEY='def' node app.js
palanik
sumber
2
Hanya menambahkan bahwa itu bekerja untuk saya di Windows dengan bash shell (cygwin; saya pikir saya menginstal alat git)
markau
@ Tiborzasz: Cygwin atau Powershell harus memperbaikinya. Ini disebutkan dua tahun kemudian, tentu saja.
orlando marinella
9
Untuk Windows gunakan: SET USER_ID = 'abc'
Mike
@ Mike, Anda harus membuat jawaban yang tepat :)
rocketspacer
6
Kita dapat menggunakan paket lintas-env ( npmjs.com/package/cross-env ) untuk membuatnya berfungsi pada unix atau windwos
Brij
79

Anda dapat mengatur variabel lingkungan melalui variabel global proses sebagai berikut:

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

Bekerja di semua platform.

jsbisht
sumber
22
... variabel lingkungan dimaksudkan untuk diatur dari luar kode, bukan terbalik - jadi ini mengalahkan tujuan dan contoh yang buruk
Soren
44
@Soren Program simpul kami yang meluncurkan proses anak diuntungkan dari jawaban ini, jadi ada kasus penggunaan untuk ini meskipun sedikit tidak ortodoks
pspi
2
@ pspi - Saya 99% yakin Anda melakukan kesalahan dan kecuali Anda adalah pembuat paket konfigurasi seperti ini, Anda harus menggunakan paket konfigurasi tersebut.
Soren
17
Ini berguna jika Anda menulis skrip build di js dan menjalankannya dari npm
Stephen Drew
28
Ini juga berguna untuk misalnya mengatur dan mengesampingkan lingkungan saat menjalankan tes.
mtkopone
54

Jika Anda menginginkan opsi manajemen, coba paket envs npm. Ini mengembalikan nilai lingkungan jika ditetapkan. Jika tidak, Anda dapat menentukan nilai default yang disimpan dalam variabel objek default global jika tidak di lingkungan Anda.

Menggunakan file .env ("dot ee-en-vee") atau lingkungan baik karena berbagai alasan. Individu dapat mengelola konfigurasi mereka sendiri. Anda dapat menggunakan lingkungan yang berbeda (dev, stage, prod) ke layanan cloud dengan pengaturan lingkungan mereka sendiri. Dan Anda dapat mengatur default yang masuk akal.

Di dalam .envfile Anda, setiap baris adalah entri, seperti contoh ini:

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

Anda tidak boleh memasukkan .envdalam repositori kontrol versi Anda (tambahkan ke .gitignorefile Anda ).

Untuk mendapatkan variabel dari .envfile ke lingkungan Anda, Anda dapat menggunakan skrip bash untuk melakukan hal yang sama export NODE_ENV=developmentsebelum Anda memulai aplikasi.

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

Maka ini berlaku di javascript aplikasi Anda:

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));
Benxamin
sumber
1
Hmm, saya mencoba menggunakan paket ini tetapi sepertinya hanya melacak penggunaan variabel lingkungan. Itu tidak membaca file .env ( npmjs.com/package/envs ). Apakah ini paket yang benar?
wawka
1
Kamu benar! Itu tidak membaca file .env. Ini memalukan. Saya lupa bahwa saya sedang memuat .env dengan skrip bash seperti yang disebutkan @SamT, jadi tetap berhasil.
Benxamin
1
"membutuhkan ('envs')"? Apa itu "envs"?
CodyBugstein
1
'envs' adalah nama modul simpul: npmjs.com/package/envs
Benxamin
4
Saya juga merekomendasikan menggunakan modul "dotenv", itu menempatkan semua variabel ENV ke objek proses, cukup rapi dengan cara.
Bruno de Oliveira
37

Itu tergantung pada sistem operasi Anda dan shell Anda

Di linux dengan shell bash , Anda membuat variabel lingkungan seperti ini (di konsol):

export FOO=bar

Untuk informasi lebih lanjut tentang variabel lingkungan di ubuntu (misalnya):

Variabel lingkungan di ubuntu

leszek.hanusz
sumber
1
Kemudian lihat jawaban ini: stackoverflow.com/questions/135688/…
leszek.hanusz
2
Dan bagaimana dengan Windows? Bisakah Anda tambahkan di sini?
YakovL
Ah, tidak masalah, sepertinya dijawab di sini: stackoverflow.com/questions/9249830/…
YakovL
di Linux bash, apakah nilai-nilai ini bertahan? bagaimana jika saya hanya ingin menjalankannya hanya ketika terminal terbuka sehingga tidak menyebabkan masalah dengan aplikasi lain nanti?
JesseBoyd
13

Seperti kata ctrlplusb, saya sarankan Anda untuk menggunakan paket dotenv, tetapi cara lain untuk melakukan ini adalah membuat file js dan mengharuskannya di baris pertama server aplikasi Anda.

env.js:

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

app.js:

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

Pengguna Windows: perhatikan! Perintah-perintah ini direkomendasikan untuk Unix tetapi pada Windows mereka hanya sementara. Mereka menetapkan variabel hanya untuk shell saat ini, segera setelah Anda me-restart mesin Anda atau memulai shell terminal baru, mereka akan hilang.

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

Untuk menetapkan variabel lingkungan persisten pada Windows Anda harus menggunakan salah satu dari pendekatan berikut:

A) .env file dalam proyek Anda - ini adalah metode terbaik karena itu berarti Anda dapat memindahkan proyek Anda ke sistem lain tanpa harus mengatur vars lingkungan Anda pada sistem beore Anda dapat menjalankan kode Anda.

  1. Buat .envfile di root folder proyek Anda dengan konten:TEST="hello world"

  2. Tulis beberapa kode simpul yang akan membaca file itu. Saya sarankan menginstal dotenv ( npm install dotenv --save) dan kemudian tambahkan require('dotenv').config();selama kode pengaturan simpul Anda.

  3. Sekarang kode simpul Anda akan dapat diaksesprocess.env.TEST

File env bagus untuk menyimpan kunci-api dan rahasia lain yang tidak ingin Anda miliki di basis kode Anda. Pastikan untuk menambahkannya ke .gitignore.

B) Gunakan Powershell - ini akan membuat variabel yang dapat diakses di terminal lain. Namun berhati-hatilah, variabel akan hilang setelah Anda me-restart komputer Anda.

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

Metode ini banyak direkomendasikan di forum Windows, tetapi saya tidak berpikir orang-orang sadar bahwa variabel tidak bertahan setelah sistem dinyalakan kembali ....

C) Gunakan Windows GUI

  1. Cari "Variabel Lingkungan" di Start Menu Search atau di Control Panel
  2. Pilih "Edit variabel lingkungan sistem"
  3. Dialog akan terbuka. Klik tombol "Variabel Lingkungan" di bagian bawah dialog.
  4. Sekarang Anda punya jendela kecil untuk mengedit variabel. Cukup klik tombol "Baru" untuk menambahkan variabel lingkungan baru. Mudah.
Drkawashima
sumber
8

Langkah 1: Tambahkan variabel lingkungan Anda ke file yang sesuai. Misalnya, lingkungan pementasan Anda dapat dipanggil .env.staging, yang berisi variabel lingkungan USER_IDdan USER_KEY, khusus untuk lingkungan pementasan Anda.

Langkah 2: Di package.jsonfile Anda , tambahkan berikut ini:

"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",
  ...
}

kemudian panggil di skrip deploy Anda seperti ini:

npm run build:staging

Pengaturan super sederhana dan bekerja seperti pesona!

Sumber: https://medium.com/@tacomanator/environmentments-with-create-react-app-7b645312c09d

Blairg23
sumber
2
@ JohnXiao bagaimana?
Blairg23
4

Datang di alat yang bagus untuk melakukan ini.

simpul-env-file

Mem-parsing dan memuat file lingkungan (mengandung ekspor variabel ENV) ke lingkungan Node.js, yaitu process.env- Menggunakan gaya ini:

.env

# some env variables

FOO=foo1
BAR=bar1
BAZ=1
QUX=
# QUUX=
Sean McClory
sumber
2

Sebagai jawaban ekspansi @ctrlplusb,
saya sarankan Anda juga melihat-lihat env-dot-proppaket.

Ini memungkinkan Anda untuk mengatur / mendapatkan properti dari process.envmenggunakan a dot-path.

Mari kita asumsikan bahwa Anda process.envmengandung yang berikut:

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

Kemudian Anda dapat memanipulasi variabel lingkungan seperti itu:

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'}

Ini membantu Anda untuk menguraikan variabel lingkungan dan menggunakannya sebagai objek konfigurasi di aplikasi Anda.
Ini juga membantu Anda menerapkan konfigurasi 12 faktor .

simonepri
sumber
2

Cara yang sangat baik untuk melakukan variabel lingkungan yang berhasil saya gunakan adalah di bawah ini:

A. Memiliki file konfigurasi yang berbeda :

  1. dev.js // ini memiliki semua variabel lingkungan hanya untuk pengembangan
    File ini berisi:

    module.exports = {
     ENV: 'dev',
     someEnvKey1 : 'some DEV Value1',
     someEnvKey2 : 'some DEV Value2'
    };
  2. stage.js // ini memiliki semua variabel lingkungan untuk pengembangan saja

    ..
  3. qa.js // ini memiliki semua variabel lingkungan untuk pengujian qa saja
    File ini berisi:

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

CATATAN : nilainya berubah dengan lingkungan, sebagian besar, tetapi kunci tetap sama.

  1. Anda dapat memiliki lebih banyak

  2. z__prod.js // ini memiliki semua variabel lingkungan untuk produksi / hanya hidup.
    CATATAN: File ini tidak pernah digabungkan untuk digunakan

  3. Masukkan semua file konfigurasi ini ke / config / folder

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

CATATAN : Nama prod berbeda dari yang lain, karena tidak akan digunakan oleh semua.

B. Atur variabel lingkungan OS / Lambda / AzureFunction / GoogleCloudFunction dari file konfigurasi

Sekarang idealnya, variabel konfigurasi ini dalam file, harus pergi sebagai variabel lingkungan OS (atau, variabel fungsi LAMBDA, atau, variabel fungsi Azure, Fungsi Google Cloud, dll.)

jadi, kami menulis otomatisasi di OS Windows (atau lainnya)

  1. Asumsikan kita menulis file bat ' setenv ', yang mengambil satu argumen yaitu lingkungan yang ingin kita atur

  2. Sekarang jalankan " setenv dev "

a) Ini mengambil input dari variabel argumen yang diteruskan ('dev' untuk saat ini)
b) membaca file yang sesuai ('config \ dev.js')
c) menetapkan variabel lingkungan di OS Windows (atau lainnya)

Sebagai contoh,

Konten setenv.bat mungkin:

    node setenv.js

Konten setenv.js mungkin:

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

Itu saja , lingkungan Anda siap digunakan.

Ketika Anda melakukan ' setenv qa ', semua variabel lingkungan qa akan siap digunakan dari qa.js, dan siap untuk digunakan oleh program yang sama (yang selalu meminta process.env.someEnvKey1, tetapi nilai yang didapat adalah qa satu).

Semoga itu bisa membantu.

Manohar Reddy Poreddy
sumber
1

Jadikan hidup Anda lebih mudah dengan dotenv-webpack . Cukup instal npm install dotenv-webpack --save-dev, lalu buat .envfile di root aplikasi Anda (ingat untuk menambahkan ini .gitignoresebelum Anda git push). Buka file ini, dan atur beberapa variabel lingkungan di sana, seperti misalnya:

ENV_VAR_1=1234
ENV_VAR_2=abcd
ENV_VAR_3=1234abcd

Sekarang, di konfigurasi webpack Anda tambahkan:

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.

Hanya const Dotenv = require('dotenv-webpack');,, plugins: [new Dotenv()]dan tentu saja module.exports = webpackConfig; // Export all custom Webpack configs.diperlukan. Namun, dalam beberapa skenario Anda mungkin mendapatkan beberapa kesalahan. Untuk ini, Anda memiliki solusinya dan menyiratkan bagaimana Anda dapat memperbaiki kesalahan tertentu.

Sekarang, di mana pun Anda inginkan, Anda hanya dapat menggunakan process.env.ENV_VAR_1, process.env.ENV_VAR_2, process.env.ENV_VAR_3dalam aplikasi Anda.

Daniel Danielecki
sumber
0

Saya mendapatkan undefined setelah menetapkan sistem env var. Ketika saya meletakkan APP_VERSION di User env var, maka saya dapat menampilkan nilai dari node melalui process.env.APP_VERSION

omencat
sumber
-1

Jika Anda menggunakan mac / linux dan Anda ingin mengambil parameter lokal ke mesin yang Anda gunakan, inilah yang akan Anda lakukan:

  1. Di terminal jalankan nano ~ / .bash_profile
  2. tambahkan baris seperti: ekspor MY_VAR = var
  3. simpan & jalankan sumber ~ / .bash_profile
  4. dalam penggunaan node seperti: console.log ( process.env.MY_VAR );
TacoEater
sumber