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

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

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

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

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

USER_ID, USER_KEY

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

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

21 ответ

Решение

Переменные среды (в данном случае) используются для передачи учетных данных вашему приложению. 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 для экспорта переменных.

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

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

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

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

Просто укажите значения env в командной строке

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

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

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

Внутри вашего .env file каждая строка является записью, как этот пример:

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));

Это зависит от вашей операционной системы и вашей оболочки

В linux с оболочкой bash вы создаете переменные окружения следующим образом (в консоли):

export FOO=bar

Для получения дополнительной информации о переменных окружения в Ubuntu (например):

Переменные окружения в Ubuntu

Важно для Windows: существует несколько способов установки переменных среды. Но большинство из них НЕ являются постоянными, они являются временными для текущей оболочки. (лайк SET SWEDISH_CHEF="bork bork" или же $env:SWEDISH_CHEF = "bork bork")

Чтобы сохранить его, используйте команду PowerShell:[Environment]::SetEnvironmentVariable("SWEDISH_CHEF", "bork bork", "User") примечание: третий аргумент, "User", указывает уровень (также может быть "Process" или же "Machine" но из того, что я нашел "User" на самом деле тот, который используется для process.env)

Чтобы убедиться, что он сохранился: Запустите новый терминал, запустите node и введите process.env.SWEDISH_CHEF в оболочке узла для печати значения.

edit: env var не сохраняется после перезапуска. поэтому я настроил его через графический интерфейс в разделе "Мой компьютер", чтобы он сохранялся вечно

edit2: более простой вариант, конечно, просто создать .env файл в папке вашего проекта. SWEDISH_CHEF="bork bork"

Как сказал ctrlplusb, я рекомендую вам использовать packege 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

Шаг 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

Облегчи свою жизнь с помощью 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 в вашем приложении.

Для пользователей Windows этот вопрос переполнения стека и верхний ответ весьма полезны для того, как установить переменные окружения через командную строку

Как я могу установить NODE_ENV= производство в Windows?

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

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

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

узел-ENV-файл

Анализирует и загружает файлы среды (содержащие экспорт переменных ENV) в среду Node.js, т.е. process.env - Использует этот стиль:

.env

# some env variables

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

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

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

  1. dev.js // здесь есть все переменные окружения только для разработки
    Файл содержит:

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

    ..
    
  3. qa.js // здесь есть все переменные окружения только для тестирования
    Файл содержит:

    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"

а) Он принимает входные данные из переданной аргументной переменной (пока 'dev')
б) прочитать соответствующий файл ('config \ dev.js')
в) устанавливает переменные среды в ОС 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).

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

Как расширение ответа @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-факторную конфигурацию.

Почти как некоторые другие ответы, но без какой-либо библиотеки или (bash)export.

У меня есть некоторые зашифрованные переменные, и мне нужно генерировать их на лету.

Волшебство происходит сset -a && ... && set +aкоторый может быть некоторым контентом или файлом.

      #!/bin/sh

set -a    
SOMEVAR_A="abcd"
SOMEVAR_B="efgh"
SOMEVAR_C=123456
set +a

# or
set -a && . ./file && set +a

у меня естьdocker-entrypoint.shс:

      #!/bin/sh

node app/config/set-environment.js

ENVFILE=/tmp/.env

if [[ ! -f "$ENVFILE" ]] ; then
    echo "File $ENVFILE is not there, aborting."
    exit
fi

# here is where things happen
set -a && . $ENVFILE && set +a

if [ "${NODE_ENV}" = "development" ]; then
  npx nodemon app/server.js
else
  node app/server.js
fi

exec "$@"

Покаset-environment.jsгенерирует (tmp).envфайл

Используйте кросс-окружение. Это избавит вас от головной боли

npm i -S cross-env

cross-env PARAM=value node ./index.js

Обычно это хорошо для не-учетных данных. Для таких вещей, как учетные данные и ключи, лучше не хранить жестко заданный идентификатор пользователя и пароль, а использовать .envфайл, которого нет в репо и dotenv

      >NODE_ENV=production node ./bin/www

Создайте файл с именемlocal-envи заполнить его переменными

      PORT=80
DB_NAME=foo
SOME_URL=example.com

Теперь запустите node таким образом:

      source ./local_env ; node index.js

Я получил неопределенный после установки системной переменной en. Когда я помещаю APP_VERSION в User env var, я могу отобразить значение из узла через process.env.APP_VERSION

если вы используете функцию отладки кода Visual Studio, вы можете добавить "envFile": "${workspaceRoot}/.env"для запуска конфигурации. Таким образом, вам не нужно использовать dotenv.

      {
        "cwd": "${workspaceRoot}",
        "command": "npm start",
        "name": "Run be",
        "request": "launch",
        "type": "node-terminal",
        "envFile": "${workspaceRoot}/.env"
},
Другие вопросы по тегам