Установка переменных среды для узла для извлечения


415

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

Есть несколько способов загрузки учетных данных.

  1. Загружен из переменных среды,
  2. Загружен из файла JSON на диске,

Ключи должны быть следующими:

USER_ID, USER_KEY

... Это означает, что если вы правильно установили переменные среды, вам вообще не нужно управлять учетными данными в вашем приложении.

Исходя из некоторого Google, кажется, что мне нужно установить переменные в process.env? Как и где я могу установить эти учетные данные? Пример пожалуйста.

Ответы:


397

Переменные среды (в данном случае) используются для передачи учетных данных вашему приложению. USER_IDи USER_KEYоба могут быть доступны из process.env.USER_IDи process.env.USER_KEYсоответственно. Вам не нужно редактировать их, просто получите доступ к их содержимому.

Похоже, что они просто дают вам выбор между загрузкой вашего USER_IDили USER_KEYиз любого process.envили какого-то определенного файла на диске.

Теперь волшебство происходит при запуске приложения.

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 да, вот в чем суть dotenv, поскольку он прочитает ваш .envфайл и применит его.
balexandre

201

Я настоятельно рекомендую заглянуть в пакет Dotenv.

https://github.com/motdotla/dotenv

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

В основном вам нужен файл .env (который я настоятельно рекомендую игнорировать в вашем git / mercurial / etc):

FOO=bar
BAZ=bob

Затем как можно раньше вставьте в файл ввода приложения следующую строку:

require('dotenv').config();

Boom. Выполнено. '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 (cygwin; я думаю, что она установлена ​​с помощью инструментов git).
Маркау

@TiborSzasz: Cygwin или Powershell должны это исправить. Это упоминается два года спустя, конечно.
Орландо Маринелла

9
Для Windows используйте: SET USER_ID = 'abc'
Майк

@ Майк, ты должен сделать правильный ответ :)
rocketspacer

6
Мы можем использовать пакет cross-env ( npmjs.com/package/cross-env ), чтобы он работал на Unix или WindWOS
Brij

79

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

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

Работает на всех платформах.


22
... переменные окружения предназначены для установки снаружи кода, а не внутри - так что это побеждает цель и плохой пример
Сорен

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

2
@pspi - Я на 99% уверен, что вы делаете это неправильно, и если вы не являетесь автором пакета конфигурации, подобного этому, вы должны использовать вместо этого пакет конфигурации.
Сорен

17
Это полезно, если вы пишете сценарии сборки в js и запускаете их из npm
Стивен Дрю

28
Это также полезно, например, для установки и переопределения среды при запуске тестов.
mtkopone

54

Если вам нужна опция управления, попробуйте пакет envs npm. Возвращает значения среды, если они установлены. В противном случае вы можете указать значение по умолчанию, которое сохраняется в глобальной переменной объекта по умолчанию, если оно отсутствует в вашей среде.

Использование .env ("dot ee-en-vee") или файлов окружения хорошо по многим причинам. Люди могут управлять своими собственными конфигами. Вы можете развертывать различные среды (dev, stage, prod) в облачных сервисах с их собственными настройками среды. И вы можете установить разумные значения по умолчанию.

Внутри вашего .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, так что все равно работало.
Benxamin

1
"требуют ( 'envs')"? Что такое "envs"?
CodyBugstein

1
'envs' - это имя модуля узла: npmjs.com/package/envs
Benxamin

4
Также я рекомендую использовать модуль "dotenv", он помещает все переменные ENV в объект процесса, кстати, довольно аккуратно.
Бруно де Оливейра

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 файл в вашем проекте - это лучший метод, потому что он будет означать, что вы можете переместить ваш проект в другие системы без необходимости устанавливать переменные среды на этой системе, так как вы можете запустить свой код.

  1. Создайте .envфайл в корневой папке вашего проекта с содержимым:TEST="hello world"

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

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

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

Б) Использовать Powershell - это создаст переменную, которая будет доступна в других терминалах. Но будьте осторожны, переменная будет потеряна после перезагрузки компьютера.

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

Этот метод широко рекомендуется на форумах Windows, но я не думаю, что люди знают, что переменная не сохраняется после перезагрузки системы ....

C) Используйте Windows GUI

  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

Наткнулся на хороший инструмент для этого.

узел-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

Очень хороший способ сделать переменные окружения, которые я успешно использовал, ниже:

А. Иметь разные конфигурационные файлы :

  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

ПРИМЕЧАНИЕ . Название prod отличается от других, так как оно будет использоваться не всеми.

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 one).

Надеюсь, это поможет.


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

Я получил неопределенный после установки системной переменной en. Когда я помещаю APP_VERSION в User 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.