Для приложений производственного уровня необходима поддержка нескольких окружений. Например, вам нужно будет использовать разные базы данных для разных окружений. Существует множество вариантов использования, и это лишь один из них.
Сегодня мы рассмотрим, как можно управлять несколькими окружениями в приложении NodeJS.
Традиционный способ
Самый простой способ использования переменных окружения — это использование нашего файла package.json.
Давайте создадим две команды, чтобы продемонстрировать два окружения.
"scripts": {
"start-dev": "PORT=3000 ts-node-dev --respawn src/index.ts",
"start-prod": "PORT=4000 ts-node-dev --respawn src/index.ts"
}
Мы определили две команды. Для разработки мы задали start-dev
, где переменная PORT должна иметь значение 3000. А для prod оно будет равно 4000.
Если мы запустим наше приложение
yarn start-dev
Вы получите следующее сообщение.
Connected successfully on port 3000
а запуск start-prod даст вам следующее сообщение
Connected successfully on port 4000
Итак, мы успешно сделали наше приложение настраиваемым.
Давайте сделаем еще один шаг вперед.
Что, если нам нужна другая переменная, которая будет меняться в разных окружениях? Мы можем просто добавить еще одну переменную внутрь этой строки.
"scripts": {
"start-dev": "PORT=3000 SOMETHING_ELSE=dev ts-node-dev --respawn src/index.ts",
"start-prod": "PORT=4000 SOMETHING_ELSE=dev ts-node-dev --respawn src/index.ts"
}
Здесь SOMETHING_ELSE
будет доступна через process.env.SOMETHING_ELSE
.
Но в реальной жизни у нас много окружений, которые нужно менять. Как мы можем управлять этим?
Давайте создадим файл окружения
Чтобы управлять многими переменными окружения, мы можем использовать файл окружения. Перейдите в свой проект, создайте файл .env и вставьте в него следующее.
PORT=3000
SOMETHING_ELSE=dev
И удалите окружение из команды package.json.
"scripts": {
"start-dev": "ts-node-dev --respawn src/index.ts",
"start-prod": "ts-node-dev --respawn src/index.ts",
},
И давайте запустим!
yarn start-dev
Это приведет к следующему результату.
Connected successfully on port 5000
Вот это странно. Потому что мы должны увидеть 3000 в качестве порта, но он выдает нам 5000.
Причина в том, что хотя мы и добавили переменные окружения, NodeJS не собирается читать их автоматически.
Давайте прочитаем наши переменные окружения
У нас есть очень популярный пакет, который сделает это за нас. Он называется dotenv
Давайте сначала установим его.
yarn add dotenv
И импортируем его в наше приложение, как показано ниже.
import "dotenv/config";
или следующим образом
import dotenv from "dotenv";
const configuration: any = dotenv.config().parsed;
И этого достаточно. Вам больше ничего не нужно делать для чтения файлов окружения. Этот пакет сделает переменные доступными для нашего приложения через process.env
Чтобы проверить это, вы можете запустить.
yarn start-dev
И вы увидите, что приложение снова работает на порту 3000.
Множественное окружение
Давайте теперь сделаем наше приложение готовым к производству. Давайте создадим два отдельных файла для разных сред.
Создайте файлы в соответствии с окружением, например .env.development и .env.production.
Теперь нам нужно загрузить эти файлы во время загрузки. В средах Windows иногда возникают проблемы с загрузкой окружений. Чтобы решить эту проблему, давайте установим пакет с именем cross-env.
yarn add -D cross-env
Затем создайте отдельные скрипты для них в файле package.json
"dev": "cross-env NODE_ENV=development ts-node-dev --respawn src/index.ts",
"prod": "cross-env NODE_ENV=production ts-node-dev --respawn src/index.ts",
Затем измените файл конфигурации следующим образом:
import dotenv from "dotenv";
dotenv.config({ path: __dirname + `/../../.env.${process.env.NODE_ENV}` }); // change according to your need
const config = {
port: process.env.APPLICATION_PORT,
dbUrl: process.env.DB_URL,
dbPassword: process.env.DB_PASSWORD,
};
export default config;
И теперь мы можем использовать эту конфигурацию везде в нашем приложении.
import Config from "./utils/Configuration";
console.log(Config.port);
Вот и все! Теперь вы можете иметь столько окружений, сколько захотите, и легко работать с ними.
Заключительные слова
Не забудьте добавить файлы .env в файлы .gitignore. Иначе все ваши секреты будут раскрыты.
Откройте свой файл .gitignore и добавьте следующее
.env.development
.env.production
Вот и все.
Свяжитесь со мной на моем LinkedIN
Читайте больше статей на моем сайте
Github Repo
https://github.com/Mohammad-Faisal/nodejs-environment-handling