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

415

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

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

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

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

USER_ID, USER_KEY

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

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

user1107173
источник

Ответы:

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 для экспорта переменных.

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

ctrlplusb
источник
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';

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

jsbisht
источник
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));
Benxamin
источник
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

leszek.hanusz
источник
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
dpolicastro
источник
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. Теперь у вас есть небольшое окно для редактирования переменных. Просто нажмите кнопку «Создать», чтобы добавить новую переменную среды. Легко.
Drkawashima
источник
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

Blairg23
источник
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-факторную конфигурацию .

simonepri
источник
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

omencat
источник
-1

Если вы используете mac / linux и хотите получить локальные параметры для машины, которую вы используете, это то, что вы будете делать:

  1. В терминале запустите nano ~ / .bash_profile
  2. добавить строку вроде: export MY_VAR = var
  3. сохранить и запустить исходный код ~ / .bash_profile
  4. в узле используйте как: console.log ( process.env.MY_VAR );
TacoEater
источник