Avatar ·

Как прочитать переменные окружения в Node.js?

Всем привет! Я новичок в Node.js и пытаюсь разобраться с переменными окружения. У меня есть приложение, которое должно подключаться к базе данных. Пароль и имя пользователя я храню в переменных окружения, чтобы не светить их в коде (особенно если залью на GitHub). Но я никак не могу понять, как их прочитать. Я создал файл `.env` в корне проекта: ``` DB_USER=myuser DB_PASS=secret123 PORT=3000 ``` В своем `app.js` я пытаюсь сделать так: ```javascript const dbUser = process.env.DB_USER; const dbPass = process.env.DB_PASS; const port = process.env.PORT; console.log(dbUser); // undefined console.log(dbPass); // undefined console.log(port); // undefined ``` Но в консоли всегда выводится `undefined`. Я слышал, что Node.js сам не читает `.env` файлы. Что нужно сделать, чтобы они заработали? Может быть, есть какой-то встроенный модуль? Или нужно использовать стороннюю библиотеку? Подскажите, пожалуйста, как правильно организовать работу с переменными окружения в Node.js. Заранее спасибо! <<>>

Почему process.env возвращает undefined?

Вы правы: Node.js не читает файл .env автоматически. Переменные окружения в process.env — это переменные, переданные процессу операционной системой (например, через терминал или Docker-контейнер). Файл .env — это просто текстовый файл, и чтобы его содержимое попало в process.env, нужно явно загрузить его.

Решение: установка и использование пакета dotenv

Самый популярный и правильный способ — использовать пакет dotenv. Он загружает переменные из .env в process.env.

Шаг 1. Установите пакет:

npm install dotenv

Шаг 2. Подключите и настройте в самом начале вашего приложения (до любого использования process.env):

// app.js
require('dotenv').config(); // Загружаем .env

const dbUser = process.env.DB_USER;
const dbPass = process.env.DB_PASS;
const port = process.env.PORT;

console.log(dbUser); // myuser
console.log(dbPass); // secret123
console.log(port);   // 3000

После этого всё заработает. dotenv.config() находит файл .env в корне проекта (по умолчанию) и добавляет все переменные в process.env.

Важные правила работы с .env

  • Никогда не коммитьте .env в Git! Добавьте его в .gitignore:
# .gitignore
.env
  • Создайте файл-образец (.env.example) с пустыми значениями, чтобы другие разработчики знали, какие переменные нужны:
DB_USER=
DB_PASS=
PORT=3000
  • Не используйте кавычки в .env (кроме случаев, когда значение содержит пробелы). Правильно: DB_USER=myuser, неправильно: DB_USER='myuser'.
  • Для продакшена не используйте .env — задавайте переменные через систему (например, в Heroku, Docker, на сервере через export). dotenv предназначен только для разработки.

Альтернативный способ: передача переменных через командную строку

Можно задать переменные прямо при запуске Node.js (без .env):

DB_USER=myuser DB_PASS=secret123 node app.js

Но это неудобно для постоянного использования.

Проверка обязательных переменных

Чтобы избежать ошибок, добавьте проверку:

const requiredVars = ['DB_USER', 'DB_PASS', 'PORT'];
requiredVars.forEach(varName => {
  if (!process.env[varName]) {
    throw new Error(`Missing required environment variable: ${varName}`);
  }
});

Теперь ваше приложение корректно читает переменные окружения и безопасно хранит секреты. Удачи!

<<>>

Использование встроенного модуля fs для чтения .env вручную

Если вы не хотите устанавливать сторонние пакеты (например, в очень простом проекте), можно прочитать .env вручную с помощью встроенного модуля fs. Это полезно для понимания того, как работает dotenv под капотом.

// app.js
const fs = require('fs');
const path = require('path');

const envPath = path.join(__dirname, '.env');
const envContent = fs.readFileSync(envPath, 'utf-8');

envContent.split('\n').forEach(line => {
  const [key, value] = line.split('=');
  if (key && value) {
    process.env[key.trim()] = value.trim();
  }
});

console.log(process.env.DB_USER); // myuser

Недостатки этого подхода:

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

Поэтому для реальных проектов лучше использовать dotenv — он решает все эти проблемы и является стандартом де-факто в сообществе Node.js. Но если вы хотите полностью избежать зависимостей, этот вариант подойдёт для обучения или сверхпростых скриптов.