Многие разработчики начинают с жестких конфигураций и секретов в файлах JSON или JavaScript, и, хотя это работает, это представляет риск безопасности, поскольку любой разработчик с доступом к коду может потенциально просматривать секреты, такие как учетные данные для производственной базы данных и ключи API.
Если вы сейчас настраиваете свои приложения, не волнуйтесь, вы не одиноки! Большинство разработчиков в конечном итоге понимают, что жесткие учетные данные-это не то, что нужно, и начинают искать более безопасную альтернативу в виде менеджера секретов.
Это именно мы создали Допплеров —Винг разработчиков прост в использовании диспетчера секретов для приложений node.js, которые централизуют хранилище секретов с простым в использовании CLI для введения секретов как переменных среды Анкет
Переменные среды считаются Лучший способ настроить приложения , с основными преимуществами:
- Такие секреты, как учетные данные базы данных, не протекают в исходный код
- Возможность развертывания приложения в любой среде без изменений кода
Использование переменных среды для настройки node.js (и Даже приложения JavaScript Front-End) позволяют создавать и развернуть ваше приложение в любом месте, будь то для локальной разработки на MacOS, контейнер в капсуле Kubernetes или современные среды хостинга. Vercel В Хероку , NetLify , Работники Cloudflare , а также AWS Lambda Анкет
В частности, вы можете использовать переменные среды для:
- Установить Node_env переменная среды к «Развитие», Включение режима отладки в вашей среде разработки
- Предоставьте учетные данные для базы данных, специфичные для окружающей среды,
- Поставьте ключ API, например, Stripe_api_key
- Установить Имя хоста и Порт (например, Heroku Динамически устанавливает переменную среды
Примечание: Если вы мало работали с переменными среды в командной линии, ознакомьтесь с нашим Ultimate Guide для использования переменных среды в Linux и Mac Анкет
Теперь, когда вы знаете, почему переменные среды — лучший способ настроить приложения Node.js и JavaScript, давайте рассмотрим синтаксис для получения, настройки и загрузки переменных среды.
Как переменные среды в node.js заполнены
Когда ваше приложение Node.js запускается или запускается сценарий, создается новый (дочерний) процесс, который наследует переменные среды от родительского процесса. Узел анализирует переменные среды, создавая Process.env объект, где каждый ключ и значение — это строка.
Используя интерактивный терминал узла, мы можем проверить содержимое Process.env:
Теперь вы знаете, как переменные среды в node.js населяются, давайте научимся работать с ними.
Как прочитать переменную среды node.js
Доступ к переменной среды из Process.env ничем не отличается от обычного объекта:
const PATH = process.env.PATH
Единственная заметная разница с Process.env объект, это Каждый ключ и значение всегда будут строкой . Это связано с тем, что сами переменные среды могут быть только строками.
process.env.MY_INT = 1000; console.log(typeof(process.env.MY_INT)) // >> 'string'
Если значение, к которому вы получаете, с переменной среды, должно быть не строковым типом, вы должны проанализировать или разыграть ее самостоятельно, например, кастинг Порт переменная среды на целое число:
const PORT = parseInt(process.env.PORT);
В то время как синтаксис для доступа к переменной среды прост, при определении того, как переменные среды проанализированы, требуется больше мыслей, например, переменные среды, например, Как справиться с случаем, когда не поставляется требуемая переменная.
Требуемая переменная среды без дефолта
Потому что JavaScript не ошибся при доступе к ключу, которая не существует в Process.env Вам нужно будет разработать решение для того, как ваше приложение будет вести себя, когда не будет предоставлена переменная среды.
Один вариант — использовать ОК Метод из утверждение модуль:
const assert = require('assert').strict const API_KEY = process.env.API_KEY assert.ok(API_KEY, 'The "API_KEY" environment variable is required')
Если выполнено без установки Api_key Переменная среда, вас встретят что -то вроде следующего:
node:assert:399 throw err; ^ AssertionError [ERR_ASSERTION]: The "API_KEY" environment variable is required at Object. (/Users/rb/dev/required-api-key.js:3:8) at Module._compile (node:internal/modules/cjs/loader:1108:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10) at Module.load (node:internal/modules/cjs/loader:973:32) at Function.Module._load (node:internal/modules/cjs/loader:813:14) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12) at node:internal/main/run_main_module:17:47 { generatedMessage: false, code: 'ERR_ASSERTION', actual: undefined, expected: true, operator: '==' }
Зачем использовать Assert.ok ? Потому что мы хотим, чтобы наше приложение бросило исключение и выйти, если оно не настроено должным образом.
Возможно, вы думаете «это довольно уродливое», с которым лично я в порядке, так как это должно быть редким исключением, что ваше приложение неверно настроено.
Если вы хотите обработать этот случай с более приятным выводом, вы можете использовать что -то похожее на:
const API_KEY = process.env.API_KEY if (!API_KEY) { console.error('[error]: The "API_KEY" environment variable is required') process.exit(1) }
Теперь, если выполнено без установки Api_key Переменная среда, вывод будет:
[error]: The "API_KEY" environment variable is required
Независимо от того, что вы выберете, является личным предпочтением — главным, что вы обращаетесь с отсутствующей необходимой переменной среды строго и правильно.
Требуемая переменная среды со значением по умолчанию
Вы можете получить значение по умолчанию, возвращаемое, если переменная среды не существует, используя
const HOSTNAME = process.env.HOSTNAME || 'localhost' const PORT = process.env.PORT || 5000
Таким образом, хотя код для предоставления значений по умолчанию прост, вы должны Старайтесь избегать по умолчанию в коде вашего приложения , причины, по которым я расскажу дальше.
Зачем избегать значений по умолчанию для переменных среды
Причина избежать дефолтов по умолчанию переменных среды проста: единственный источник истины должен существовать для любого конфигурации приложения и секрета.
При отладке вашего приложения, поскольку оно неправильно настроено (и, поверьте мне, это только вопрос времени), удаление значений по умолчанию означает, что каждая конфигурация или секретная стоимость предоставлялось переменными среды — это ваш источник истины.
Значения по умолчанию в коде приложения могут усложнять отладку неправильного приложения, так как конечные значения конфигурации, вероятно, будут комбинацией жестких значений по умолчанию и переменных среды.
Упрощайте жизнь для вашего будущего самости (и команды), требуя, чтобы все конфигурации приложения и секретные значения были явно устанавливаются с использованием переменных среды.
Как установить переменные среды в node.js
Установка или создание новой переменной среды в node.js-это то же самое, что настройка клавиши на стандартном объекте, за исключением узла, косвенно преобразует любое нетронутое значение в строку.
Рекомендуется всегда преобразовать значение, которое вы хотите установить в качестве переменной среды в строку сначала, так как будущие версии узла могут бросить исключение, если будет назначено значение без строки.
process.env.FASTEST_SHIP = 'Millennium Falcon' process.env.HYPERDRIVE_ACTIVATED = true // This may fail in future so don't do this process.env.HYPERDRIVE_ACTIVATED = 'true' // Only assign string values console.log(process.env.HYPERDRIVE_ACTIVATED) // >> string
Изменение переменных среды в node.js
Когда дело доходит до изменения переменных среды node.js, есть две вещи, о которых следует знать:
- Изменения переменных среды в родительском процессе после создания дочернего процесса Node.js не отражены в процессе Node.js
- Изменения переменных среды в процессе node.js не влияют на родительский процесс
Как удалить переменную среды node.js
Удаление переменной среды node.js совпадает с тем, что удаление ключа из стандартного объекта:
delete process.env.USER
Удаление переменной среды влияет только на текущий сценарий или приложение и не влияет на родительский процесс.
Кроме того, если вы не смущают, почему удаление ключа из Process.env всегда верно (даже после того, как ключ был удален), вы не одиноки.
Это потому, что он только вернется ЛОЖЬ Если свойство «неконфигурируемое» , такие как Математика Пи или собственность, созданная в результате вызова Object.DefineProperty () или Object.freeze () Анкет
Проверьте Мозилла документы для оператора удаления Если вы хотите узнать больше.
Зачем избегать использования файла .env для переменных среды node.js
По мере того, как приложение растет в размерах и сложности, также количество переменных среды, необходимых для конфигурации и секретов приложения.
Популярный, но Проблемное и небезопасное решение это хранить список переменных среды в .env Файл и используйте NPM Dotenv Package анализировать .env Подайте и заполняйте Process.env объект.
В то время как .env Файлы просты и легко начать, они также вызывают новый набор проблем, таких как:
- Риск риска случайного совершения .env Файл для управления источником
- Случайно публично разоблачение файла .env
- Сохраняя .env Файлы в синхронизации в каждой местной среде разработки
- Нет стандартизированного подхода к поддержанию конкретной среды .env файлы
- Собирая разработчика, поделившись незашифрованным .env Файл с потенциально конфиденциальными данными через Slack или другое приложение для обмена публичными сообщениями может представлять дополнительные проблемы безопасности
Это лишь некоторые из причин, по которым мы рекомендуем Отказ от файлов .env и использование менеджера переменной среды, такой как Допплеров вместо.
Допплер предоставляет панель управления доступом для управления переменными среды в каждой среде с Простой в использовании CLI для доступа к конфигурации и секретам Это работает для каждого языка, структуры и платформы.
Вы можете проверить наш Mandalorion GIF Пример приложения и развернуть его в Vercel Чтобы увидеть, как использовать допплеров для управления переменными среды для приложения Node.js.
Для чего используется переменная среды node_env?
Node_env Первоначально переменная среды появилась в Express Web Framework и использовалась для изменения внутреннего поведения, такого как шаблоны кэширования и использование меньше словесных журналов, если Node_env был настроен на Производство Анкет
С тех пор он стал популярным соглашением Node.js для условной логики на основе типа среды, например:
const isDevelopment = (process.env.NODE_ENV === 'development' ? true : false) if(isDevelopment) { // use verbose logging // use server in development mode }
Резюме
Потрясающая работа! Теперь вы знаете, как использовать переменные среды в node.js для конфигурации и секретов приложения.
Хотя мы немного предвзяты, мы призываем вас Попробуйте использовать доплеров Для управления вашими переменными среды node.js, и это бесплатно, чтобы начать с нашего План сообщества (Неограниченные проекты, секреты и пользователи).
Чтобы увидеть допплеров в действии, проверьте Мандалорийский образец GIF.
Надеюсь, вам понравился пост, и если у вас есть какие -либо вопросы или отзывы, вы можете отправить мне электронное письмо в ryan@doppler.com , или пообщаться с командой доплеровской команды в нашем Форум сообщества Анкет
Оригинал: «https://dev.to/doppler/using-environment-variables-in-node-js-for-app-configuration-and-secrets-2260»