Налаштування змінних оточуючих середовищ для отримання вузла


414

Я намагаюся слідувати навчальному посібнику, і він говорить:

Існує кілька способів завантаження облікових даних.

  1. Завантажений із змінних середовища,
  2. Завантажений з файлу JSON на диску,

Ключі повинні бути такими:

USER_ID, USER_KEY

... Це означає, що якщо ви правильно встановили змінні середовища, вам взагалі не потрібно керувати обліковими записами у вашій програмі.

Виходячи з деякого Googling, виявляється, що мені потрібно встановити змінні process.env? Як і де я встановлюю ці облікові дані? Приклад Будь ласка.

Відповіді:


397

Змінні середовища (у цьому випадку) використовуються для передачі облікових даних вашій програмі. USER_IDі до них USER_KEYможна отримати доступ process.env.USER_IDі process.env.USER_KEYвідповідно, і відповідно. Вам не потрібно їх редагувати, просто отримуйте доступ до їх вмісту.

Схоже , вони просто даючи вам вибір між агрузка USER_IDі USER_KEYвід будь-якої process.envабо який - specificed файл на диску.

Тепер магія трапляється під час запуску програми.

USER_ID=239482 USER_KEY=foobar node app.js

Це передасть ідентифікатор користувача 239482та ключ користувача як foobar. Це підходить для тестування, однак для виробництва ви, мабуть, налаштовуєте деякі сценарії bash для експорту змінних.


26
Якщо ви використовуєте fishзамість bash, ви повинні використовувати: env USER_ID=239482 my_command. Наприклад, для встановлення змінних середовища для debugбібліотеки node.js : env DEBUG='*' node some_file.js fishshell.com/docs/current/faq.html#faq-single-env
SilentSteel

1
Я виявив, що мені доведеться видалити цитати навколо "*", щоб він працював:env DEBUG=* node some_file.js
divillysausages

@SamT Як встановити ці змінні в Ubuntu linux?
Мохаммед Замер

1
чи можна додати файл, а не додавати велику кількість сценаріїв env або користувачеві Unix потрібно створити скрипт bash?
mibbit

@mibbit так, саме це і dotenvє, оскільки він прочитає ваш .envфайл і застосує його.
balexandre

200

Я настійно рекомендую заглянути в пакет dotenv.

https://github.com/motdotla/dotenv

Це схоже на бібліотеку, запропоновану у відповіді від @Benxamin, але вона набагато чистіша і не вимагає ніяких скриптів bash. Також варто зазначити, що база коду популярна і доглянута.

В основному вам потрібен файл .env (який я дуже рекомендую ігнорувати з вашого git / mercurial / тощо):

FOO=bar
BAZ=bob

Потім у свій файл вступу додайте наступний рядок якомога раніше:

require('dotenv').config();

Бум. Зроблено. 'process.env' тепер буде містити вказані вище змінні:

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

Файл '.env' не потрібен, тому вам не потрібно турбуватися про перепадання програми за його відсутності.


1
Хоча якщо ви введете відповідні деталі конфігурації, які потрібні вашій програмі (наприклад, це питання цікавить), це, швидше за все, перепаде за її відсутності .., але це все одно здається хорошим варіантом.
Іоанна

6
Якщо ви шукаєте додаткову безпеку, тоді це слід зробити github.com/rolodato/dotenv-safe та кілька тестів.
ctrlplusb

1
Якщо ви хочете не вимагати цього у своїй заяві: github.com/direnv/direnv
AlecRust

100

Просто введіть значення env у командному рядку

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

2
Просто додаю, що він працював на мене в Windows з bash shell (cygwin; встановлений за допомогою інструментів git).
маркау

@TiborSzasz: Cygwin або Powershell повинні це виправити. Про це згадується через два роки, звичайно.
orlando marinella

9
Для використання в Windows: SET USER_ID = 'abc'
Майк

@Mike, ти повинен зробити правильну відповідь :)
rocketspacer

6
Ми можемо використовувати пакет cross-env ( npmjs.com/package/cross-env ), щоб змусити його працювати на unix або windwos
Brij

79

Ви можете встановити змінну середовища через глобальну змінну процесу таким чином:

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

Працює на всіх платформах.


22
... змінні середовища повинні бути встановлені ззовні коду, а не зсередини - так це перемагає мету і поганий приклад
Soren

44
@Soren наша програма вузла, яка запускає дочірній процес, скористалася цією відповіддю, тому для цього є випадки використання, хоча це трохи неортодоксально
pspi

2
@pspi - Я 99% впевнений , що ви робите це неправильно , і якщо ви не є автором пакету конфігурації , як це ви повинні використовувати такий пакет конфігурації замість цього.
Сорен

17
Це корисно, якщо ви пишете сценарії збірки в js та запускаєте їх з npm
Stephen Drew

28
Це також корисно, наприклад, для встановлення та зміни середовища під час запуску тестів.
mtkopone

54

Якщо вам потрібен варіант управління, спробуйте пакет envs npm. Він повертає значення середовища, якщо вони встановлені. В іншому випадку ви можете вказати значення за замовчуванням, яке зберігається в глобальній змінній об'єкта за замовчуванням, якщо воно не знаходиться у вашому оточенні.

Використання .env ("dot ee-en-vee") або файлів оточення є корисним з багатьох причин. Особи можуть керувати своїми конфігураціями. Ви можете розгорнути різні середовища (розробник, етап, продукт) для хмарних служб із власними налаштуваннями середовища. І ви можете встановити розумні налаштування за замовчуванням.

Всередині вашого .envфайлу кожен рядок - це запис, як у цьому прикладі:

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

Ви не повинні включати .envу свій сховище контролю версій (додайте його у свій .gitignoreфайл).

Щоб отримати змінні з .envфайлу у ваше середовище, ви можете використовувати скрипт bash, щоб виконати еквівалент export NODE_ENV=developmentправа перед запуском програми.

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

Потім це стосується JavaScript вашої програми:

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
Хм, я намагався використовувати цей пакет, але, здається, він відстежує лише змінне використання середовища. Він не читає .env-файл ( npmjs.com/package/envs ). Це правильний пакет?
wawka

1
Ти правий! Він не читає .env файл. Це бентежить. Я забув, що завантажував .env із скриптом bash, як згадував @SamT, так що він все одно працював.
Бенксамін

1
"вимагати ('envs')"? Що таке "енвс"?
CodyBugstein

1
'envs' - це назва модуля вузла: npmjs.com/package/envs
Benxamin

4
Також я рекомендую використовувати модуль "dotenv", він додає всі змінні ENV до об'єкта procecess, до речі, дуже акуратно.
Бруно де Олівейра

37

Це залежить від вашої операційної системи та вашої оболонки

У Linux з bash оболонки ви створюєте такі змінні середовища (у консолі):

export FOO=bar

Для отримання додаткової інформації про змінні середовища на ubuntu (наприклад):

Змінні середовища на ubuntu


1
Тоді побачити цю відповідь: stackoverflow.com/questions/135688 / ...
leszek.hanusz

2
А як щодо Windows? Не могли б ви додати сюди?
ЯковЛ

Ах, фіга, виглядає він відповів тут: stackoverflow.com/questions/9249830 / ...
YakovL

в Linux bash ці значення зберігаються? що робити, якщо я просто хочу запустити його лише тоді, коли термінал відкритий, щоб потім не викликати проблем з іншими програмами?
ДжессіБойд

13

Як сказав ctrlplusb, я рекомендую вам скористатись пакетом dotenv, але інший спосіб зробити це - створити js-файл та вимагати його у першій рядку вашого сервера додатків.

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: зверніть увагу! Ці команди рекомендуються для Unix, але для Windows вони є лише тимчасовими. Вони встановлюють змінну лише для поточної оболонки, як тільки ви перезавантажите машину або запустите нову термінальну оболонку, вони вже не будуть.

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

Щоб встановити стійку змінну середовища в Windows, замість цього потрібно використовувати один із наступних підходів:

A) .env-файл у вашому проекті - це найкращий метод, тому що це означає, що ви можете перенести свій проект в інші системи без необхідності встановлення вашої обстановки vars в цій системі, оскільки ви можете запустити свій код.

  1. Створіть .envфайл у корені папки проекту із вмістом:TEST="hello world"

  2. Напишіть код вузла, який прочитає цей файл. Я пропоную встановити dotenv ( npm install dotenv --save), а потім додати require('dotenv').config();під час встановлення вашого вузла код.

  3. Тепер ваш код вузла зможе отримати доступprocess.env.TEST

Env-файли - це добре зберігати api-ключі та інші секрети, які ви не хочете мати у своїй кодовій базі. Просто не забудьте додати його до свого .gitignore.

B) Використовуйте Powershell - це створить змінну, яка буде доступна в інших терміналах. Але будьте обережні, змінна буде втрачена після перезавантаження комп'ютера.

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

Цей метод широко рекомендується на форумах Windows, але я не думаю, що люди знають, що змінна не зберігається після перезавантаження системи ....

C) Використовуйте графічний інтерфейс Windows

  1. Шукайте "Змінні середовища" в меню "Пуск" або на Панелі керування
  2. Виберіть "Змінити змінні системного середовища"
  3. Відкриється діалог. Натисніть кнопку "Змінні середовища" внизу діалогу.
  4. Тепер у вас є невелике вікно для редагування змінних. Просто натисніть кнопку "Створити", щоб додати нову змінну середовища. Легко.

8

Крок 1. Додайте змінні середовища до відповідного файлу. Наприклад, ваше середовище інсценізації може бути названо .env.staging, яке містить змінні середовища USER_IDі USER_KEY, характерні для вашого середовища.

Крок 2: У свій package.jsonфайл додайте наступне:

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

потім зателефонуйте у сценарій розгортання так:

npm run build:staging

Супер простий налаштування і працює як шарм!

Джерело: https://medium.com/@tacomanator/environments-with-create-react-app-7b645312c09d


2
@JohnXiao як це?
Blairg23


4

Натрапив на гарний інструмент для цього.

node-env-файл

Розбирає та завантажує файли середовища (містять експорт змінної ENV) у середовище Node.js, тобто process.env- Використовує цей стиль:

.env

# some env variables

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

2

Як розширення відповіді @ctrlplusb,
я б запропонував вам також поглянути на env-dot-propпакет.

Це дозволяє встановити / отримати властивості process.envза допомогою dot-path.

Припустимо, що ваш process.envмістить наступне:

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

Тоді ви можете маніпулювати змінними середовища таким чином:

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

Це допомагає розібрати змінні середовища та використовувати їх як конфігураційний об’єкт у вашій програмі.
Це також допомагає реалізувати 12-факторну конфігурацію .


2

Нижче наведено дуже хороший спосіб роботи із змінними середовища, які я успішно використовував:

A. Майте різні конфігураційні файли :

  1. dev.js // тут є всі змінні середовища лише для розробки
    Файл містить:

    module.exports = {
     ENV: 'dev',
     someEnvKey1 : 'some DEV Value1',
     someEnvKey2 : 'some DEV Value2'
    };
  2. stage.js // тут є всі змінні середовища лише для розвитку

    ..
  3. qa.js // у ньому є всі змінні середовища лише для тестування qa
    . Файл містить:

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

ПРИМІТКА . В основному значення змінюються з оточенням, але клавіші залишаються однаковими.

  1. ви можете мати більше

  2. z__prod.js // у ньому є всі змінні середовища для виробництва / лише в реальному часі
    ПРИМІТКА: Цей файл ніколи не постачається для розгортання

  3. Помістіть усі ці конфігураційні файли в / config / папку

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

ПРИМІТКА . Назва продукту відрізняється від інших, оскільки використовується не всіма.

B. Встановіть змінні середовища OS / Lambda / AzureFunction / GoogleCloudFunction з конфігураційного файлу

Тепер в ідеалі ці змінні конфігурації у файлі мають бути змінними середовища ОС (або, змінними функцій LAMBDA, або змінними функцій Azure, функціями Google Cloud тощо).

таким чином, ми пишемо автоматизацію в ОС Windows (або інші)

  1. Припустимо, ми пишемо файл bat ' setenv ', який бере один аргумент - це середовище, яке ми хочемо встановити

  2. Тепер запустіть " setenv dev "

a) Для цього потрібно взяти вхід з змінної аргументу ('dev' зараз);
b) прочитати відповідний файл ('config \ dev.js')
c) встановлює змінні середовища в ОС Windows (або інші)

Наприклад,

Вміст setenv.bat може бути:

    node setenv.js

Вміст setenv.js може бути:

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

Це все , ваше середовище готове до використання.

Коли ви робите ' setenv qa ', всі змінні середовища qa будуть готові до використання з qa.js та готові до використання тією ж програмою (яка завжди запитує process.env.someEnvKey1, але отримане значення - qa).

Сподіваюся, що це допомагає.


1

Полегшіть своє життя за допомогою dotenv-webpack . Просто встановіть його npm install dotenv-webpack --save-dev, а потім створіть .envфайл у корені програми (не забудьте додати це .gitignoreперед вами git push). Відкрийте цей файл і встановіть там деякі змінні середовища, наприклад, наприклад:

ENV_VAR_1=1234
ENV_VAR_2=abcd
ENV_VAR_3=1234abcd

Тепер у свій веб-пакет конфігурації додайте:

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.

Тільки const Dotenv = require('dotenv-webpack');, plugins: [new Dotenv()]і, звичайно module.exports = webpackConfig; // Export all custom Webpack configs., потрібно. Однак у деяких сценаріях ви можете отримати деякі помилки. Для цього у вас є рішення, а також випливає, що ви можете виправити певну помилку.

Тепер, де б ви хочете , ви можете просто використовувати process.env.ENV_VAR_1, process.env.ENV_VAR_2, process.env.ENV_VAR_3в вашому додатку.


0

Я не визначався після встановлення системи env var. Коли я поміщаю APP_VERSION у var env var, тоді я можу відображати значення з вузла через process.env.APP_VERSION


-1

Якщо ви використовуєте mac / linux і хочете отримати локальні параметри на машині, яку ви використовуєте, це буде робити:

  1. У термінальному виконанні nano ~ / .bash_profile
  2. додайте такий рядок, як: export MY_VAR = var
  3. зберегти та запустити джерело ~ / .bash_profile
  4. у вузлі використовують як: console.log ( process.env.MY_VAR );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.