Управление переменными среды в Node.js с помощью dotenv

Введение Развертывание приложения требует, чтобы разработчики тщательно продумали его настройку. Многие приложения развертываются в среде разработки перед развертыванием в производственной среде. Нам нужно убедиться, что каждая среда настроена правильно, это может иметь катастрофические последствия, если наше производственное приложение, например, использует нашу базу данных разработки. Переменные среды позволяют нам управлять конфигурацией наших приложений отдельно от нашей кодовой базы. Разделить

Вступление

Развертывание приложения требует, чтобы разработчики тщательно продумали его настройку. Многие приложения развертываются в среде разработки перед развертыванием в производственной среде. Нам нужно убедиться, что каждая среда настроена правильно, это может иметь катастрофические последствия, если наше производственное приложение, например, использует нашу базу данных разработки.

Переменные среды позволяют нам управлять конфигурацией наших приложений отдельно от нашей кодовой базы. Разделение конфигураций упрощает развертывание нашего приложения в разных средах.

Большие приложения обычно имеют много переменных среды. Чтобы лучше управлять ими, мы можем использовать библиотеку dotenv , которая позволяет нам загружать переменные среды из файла.

Что такое переменные среды?

Из программирования мы знаем, что переменные - это сохраненные значения, которые можно изменять. Они изменчивы и могут меняться - отсюда и название переменных .

Переменные среды - это внешние по отношению к нашему приложению переменные, которые находятся в ОС или в контейнере приложения, в котором выполняется. Переменная среды - это просто имя, сопоставленное со значением.

По соглашению, имя пишется с заглавной буквы, например [email protected] . Значения представляют собой строки.

Если вы откроете терминал или приложение командной строки в Linux, Mac OS или Windows и введете set , вы увидите список всех переменных среды для вашего пользователя.

Зачем использовать переменные среды?

Переменные среды отлично подходят для разделения конфигураций приложений. Как правило, для работы наших приложений требуется установить множество переменных. Используя внешние конфигурации, ваше приложение можно легко развернуть в различных средах. Эти изменения не зависят от изменений кода, поэтому они не требуют перестройки приложения для внесения изменений.

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

  • HTTP-порт и адрес
  • Информация о соединении с базой данных, кешем и прочим хранилищем
  • Расположение статических файлов / папок
  • Конечные точки внешних сервисов
    • Например, в среде разработки ваше приложение будет указывать на URL-адрес тестового API, тогда как в производственной среде ваше приложение будет указывать на URL-адрес действующего API.

Конфиденциальные данные, такие как ключи API, не должны быть в исходном коде или известны лицам, которым не нужен доступ к этим внешним службам.

Переменные среды в Node.js

Рассмотрим приложение Hello World Node.js с переменными среды для хоста и порта, на котором работает приложение.

Создайте новый файл с именем hello.js рабочей области и добавьте следующее:

 const http = require('http'); 
 
 // Read the host address and the port from the environment 
 const hostname = process.env.HOST; 
 const port = process.env.PORT; 
 
 // Return JSON regardless of HTTP method or route our web app is reached by 
 const server = http.createServer((req, res) => { 
 res.statusCode = 200; 
 res.setHeader('Content-Type', 'application/json'); 
 res.end(`{"message": "Hello World"}`); 
 }); 
 
 // Start a TCP server listening for connections on the given port and host 
 server.listen(port, hostname, () => { 
 console.log(`Server running at http://${hostname}:${port}/`); 
 }); 

Node.js предоставляет глобальную переменную process.env - объект, содержащий все переменные среды, доступные пользователю, запускающему приложение. Ожидается, что имя хоста и порт, на котором будет работать приложение, будут определены средой.

Вы можете запустить это приложение, введя эту команду в терминале, HOST=localhost PORT=3000 node hello.js , если у вас установлен Node.js. На консоли вы увидите следующее сообщение:

 Server running at http://localhost:3000/ 

Создавать и читать переменные среды очень просто. Допустим, мы пишем микросервис, который взаимодействует с экземпляром MySQL и Redis , мы также хотели бы, чтобы сведения о подключении были доступны в переменных нашей среды.

У нас может получиться такая команда:

 $ DB_HOST=localhost DB_PORT=3306 DB_USER=test DB_PASSWORD=verySecret123!$ DB_MAX_CONNECTIONS=15 CACHE_ADDR=localhost CACHE_PORT= 6379 HOST=localhost PORT=3000 node hello.js 

Разработка с использованием нескольких переменных среды быстро становится громоздкой. Было бы лучше, если бы переменные среды, которые нам нужно было настроить, хранились в одном центральном месте приложения, например в файле.

Библиотека dotenv

Эта библиотека выполняет одну простую задачу: загружает переменные среды из файла .env process.env в Node.js. Давайте использовать dotenv для предыдущего примера.

Во-первых, нам нужно установить его через npm :

 $ npm init # Optional, creates a local package.json that prevents global installs 
 $ npm install dotenv --save 

Затем мы вносим одно минимальное изменение в код, добавляем эту строку в начало hello.js :

 require('dotenv').config() 

Теперь в том же каталоге вашего приложения создайте новый файл с именем .env и добавьте следующее:

 HOST=localhost 
 PORT=3000 

Переменные среды объявляются так же, как если бы вы вводили их в оболочку перед запуском команды узла. Вместо того, чтобы разделять каждое присвоение переменной пробелом, мы разделяем их новой строкой . Теперь в вашей оболочке, если вы введете node hello.js , приложение будет работать на порту 3000 на вашем localhost !

Даже если dotenv , это не обязательно. Если файл .env не найден, библиотека .env Вы можете продолжать использовать переменные среды, определенные вне файла.

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

Использование в производстве

Хранение переменных среды в файле связано с одним золотым правилом: никогда не фиксируйте его в репозитории исходного кода. Вы не хотите, чтобы посторонние получали доступ к секретам, таким как ключи API. Если вы используете dotenv для управления переменными среды, обязательно .env файл .env в свой .gitignore или соответствующий черный список для вашего инструмента контроля версий.

Если вы не можете зафиксировать .env , тогда разработчику должен быть какой-то способ узнать, какие переменные среды требуются для запуска программного обеспечения. Обычно разработчики перечисляют переменные среды, необходимые для запуска программы, в README или аналогичной внутренней документации.

Некоторые разработчики создают и поддерживают .sample-env в репозитории исходного кода. В этом образце файла будут перечислены все переменные среды, используемые приложением, например:

 HOST= 
 PORT= 

Затем разработчик клонирует репозиторий, копирует .sample-env в новый .env и заполняет значения.

Если ваше приложение работает на физической или виртуальной машине (например, капли Digital Ocean , Amazon EC2 и виртуальные машины Azure ), то вы можете создать .env, войдя на сервер, и он будет работать так же, как и .env на вашем локальном компьютере.

Если ваше приложение работает в контейнере докеров или в провайдере платформы как услуги, таком как Heroku или Openshift, вы сможете настраивать переменные среды без использования файла .env

Помните , что он не работает тихо, поэтому это не повлияет на работу приложения, если файл отсутствует.

Заключение

Переменные среды существуют вне кода нашего приложения, они доступны там, где наше приложение работает. Их можно использовать для отделения конфигурации нашего приложения от его кода, что позволяет легко развертывать наши приложения в различных средах.

В приложениях Node.js переменные среды доступны через глобальную переменную process.env Мы можем установить переменные среды перед запуском команды node или использовать dotenv которая позволяет нам определять переменные среды в файле .env

.env никогда не должен находиться в репозитории исходного кода.

comments powered by Disqus