Установка переменных среды для узла для извлечения
Я пытаюсь следовать учебнику, и он говорит:
"Есть несколько способов загрузки учетных данных.
- Загружен из переменных среды,
- Загружен из файла 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 (например):
Важно для 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 этот вопрос переполнения стека и верхний ответ весьма полезны для того, как установить переменные окружения через командную строку
Если вы используете mac/linux и хотите получить локальные параметры на используемом вами компьютере, вы сделаете следующее:
- В терминале запустите nano ~/.bash_profile
- добавьте строку вроде: export MY_VAR=var
- сохранить и запустить исходный код ~/.bash_profile
- в узле используйте как: console.log(process.env.MY_VAR);
Наткнулся на хороший инструмент для этого.
Анализирует и загружает файлы среды (содержащие экспорт переменных ENV) в среду Node.js, т.е. process.env
- Использует этот стиль:
.env
# some env variables
FOO=foo1
BAR=bar1
BAZ=1
QUX=
# QUUX=
Очень хороший способ сделать переменные окружения, которые я успешно использовал, ниже:
А. Иметь разные конфигурационные файлы:
dev.js // здесь есть все переменные окружения только для разработки
Файл содержит:module.exports = { ENV: 'dev', someEnvKey1 : 'some DEV Value1', someEnvKey2 : 'some DEV Value2' };
stage.js // здесь есть все переменные среды только для разработки
..
qa.js // здесь есть все переменные окружения только для тестирования
Файл содержит:module.exports = { ENV: 'dev', someEnvKey1 : 'some QA Value1', someEnvKey2 : 'some QA Value2' };
ПРИМЕЧАНИЕ: значения в основном меняются в зависимости от среды, но ключи остаются прежними.
ты можешь иметь больше
z__prod.js // здесь есть все переменные окружения только для производства / реального времени
ПРИМЕЧАНИЕ. Этот файл никогда не связывается для развертывания.Поместите все эти файлы конфигурации в папку /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 (или другой)
Предположим, мы пишем bat-файл "setenv", который принимает один аргумент, то есть среду, которую мы хотим установить
Теперь запустите "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
Создайте файл с именем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"
},