Узел.js: установка переменных среды

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

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

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

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

USER_ID, USER_KEY

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

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

14 ответов


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

- бум. Сделанный. - процесс.env ' теперь будет содержать переменные выше:

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

The '.файл env ' не требуется, поэтому вам не нужно беспокоиться о том, что ваше приложение упадет в его отсутствие.


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

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

если вы хотите вариант управления, попробовать 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 в репозитории управления версиями (добавьте его в свой ).

чтобы получить переменные из .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));

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

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

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


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

в linux с оболочкой bash вы создаете переменные среды, подобные этому(в консоли):

export FOO=bar

для получения дополнительной информации о переменных среды на ubuntu (например):

переменные среды на ubuntu


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

Как установить NODE_ENV=production в Windows?


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

node-env-file

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

.env

# some env variables

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

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


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

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

чтобы убедиться, что он сохраняется: запустите новый терминал, беги!--8--> и вводим process.env.SWEDISH_CHEF в оболочке узла для печати значения.

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

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


как расширение @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'}

это поможет вам проанализировать переменные среды и использовать их в качестве объект config в вашем приложении.
Это также поможет вам реализовать 12-коэффициент конфигурации.


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

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

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

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

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

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

Примечание: значения меняются в основном со средой, но ключи остаются неизменными.

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

  2. з__прод.js / / это имеет все переменные среды для производства / live only
    Примечание: этот файл никогда не поставляется для развертывания

  3. поставить все эти файлы конфигурации в/ config / folder

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

Примечание: имя prod отличается от других, так как оно не будет использоваться всеми.

Б. установите переменные среды OS/ Lambda/ AzureFunction/ GoogleCloudFunction из файла конфигурации

теперь в идеале эти переменные конфигурации в файле должны идти как переменные среды ОС (или переменные лямбда-функции, или переменные функции Azure, функции Google Cloud, так далее.)

Итак, мы пишем автоматизация в ОС Windows (или другой)

  1. Предположим, мы пишем 'setenv' bat файл, который принимает один аргумент, который является средой, которую мы хотим установить

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

a) это принимает входные данные от переданной переменной аргумента ("dev" на данный момент)
b) прочитайте соответствующий файл ('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, и готов к использованию той же программой (которая всегда запрашивает процесс.env.someEnvKey1, но значение он получает qa one).

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


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


Как сказал 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