Несколько сред в приложении NodeJS

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

Сегодня мы рассмотрим, как можно управлять несколькими окружениями в приложении 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

Оцените статью
devanswers.ru
Добавить комментарий