Как прочитать переменные окружения в 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. Но если вы хотите полностью избежать зависимостей, этот вариант подойдёт для обучения или сверхпростых скриптов.
Ответов пока нет.
Войдите чтобы оставить ответ